NiRaj Wagh Ответов: 3

Как оценивать постфиксного выражения с использованием стека персонажа, используя конвертирование в ASCII


The code is implemented using ADT by including the "stack.h" user defined header file.

The header file has code for stack operation. I am getting wrong outputs for results greater than 9.

What changes should I make in the code to get the correct output.

I have to use a stack with char data and not int data.



#include<iostream>
#include<string.h>
#include "stack.h"
using namespace std;

void posteva(char postfix[])
{
    stack s;
    int i=0;
    while(postfix[i]!='\0')
    {
        char x=postfix[i];
        if(isdigit(x))
        {
            s.push(x);
        }
        else
        {
            int op1=s.pop()-'0';
            int op2=s.pop()-'0';
            int res;
            switch(x)
            {
                case '+':
                    res=op1+op2;
                    break;
                case '-':
                    res=op1-op2;
                    break;
                case '*':
                    res=op1*op2;
                    break;
                case '/':
                    res=op1/op2;
                    break;
                case '%':
                    res=op1%op2;
                    break;

            }
            s.push(res+'0');
        }
        i++;
    }
    cout<<"\n\nRESULT :"<<s.pop();
}

int main()
{
    char postfix[20];
    cout<<"\n\nEnter the postfix : ";
    cin>>postfix;
    posteva(postfix);
}


Что я уже пробовал:

Например, для постфиксного выражения "63*" я получаю результат как B.

3 Ответов

Рейтинг:
2

Jochen Arndt

Вы нажимаете одиночные цифры / символы в стеке. Когда число больше 9, вы нажмете несколько цифр, которые должны быть все выскочили и преобразованы в число.

Все зависит от того, как форматируются входные данные. Предполагая что-то вроде "num1 num2 op", я предлагаю написать функции для push и pop чисел:

int pushdigit(const char* input, int pos, stack *s)
{
    while (istdigit(input[pos])
    {
        s->push(input[pos++]);
    }
    // Push a zero as end of number indicator
    s->push(0);
    // Return position to next input character skipping space
    return (' ' == input[pos]) ? pos + 1 : pos;
}

int popdigit(stack *s)
{
    int num = 0;
    int mult = 1;
    // Assuming the stack provides a function to check if it is empty
    while (!s->isempty())
    {
        char c = s->pop();
        if (!isdigit(c))
            break;
        num += mult * (c - '0');
        mult *= 10;
    }
    return num;
}


Рейтинг:
1

Patrice T

Цитата:
для постфиксного выражения "63*" я получаю результат как B.

Виноват есть:
s.push(res+'0');

потому что код корректен только для однозначных значений.

Для того чтобы обрабатывать числа с более чем 1 цифрой, вам нужно иметь разделитель между числами, для этого обычно используется пробел:
2 63 3*+

Мой совет заключается в том, чтобы поместить значения в стек после преобразования в целые числа, но вам придется переписать свой код, чтобы обработать ввод числа > 9.


Рейтинг:
0

Richard MacCutchan

s.push(res+'0');

Это будет работать только для однозначного результата. В вашем случае 6 * 3 = 18. Символ "0" эквивалентен 0x30, или десятичному 48. 48 + 18 = 66, или шестнадцатеричному 0x42, который является числовым значением символа ASCII "B".