Почему не работает при попытке вычитания в оценке постфикса? - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь получить результат из постфикса. Но это дает мне неправильно при вычитании, и не знаю почему. Пожалуйста, дайте много подсказок для новичка c ++.

Я получил два операнда из стека. И попробовал вычитание «последний выстрел» - «первый выстрел».

/*pf_exp is postfix expression. String type*/
for (int i=0; i<pf_exp.length(); i++)
{
    int sub_result; // saving result.
    if (48 <= (int)pf_exp[i] && (int)pf_exp[i] <= 57)
    {
        operands.push((int)pf_exp[i] - 48);
    }
    else
    {
        /*operators is a stack<int> from '#include<stack>' storing operands.*/
        int operand2 = operands.top();
        operands.pop();
        int operand1 = operands.top();
        operands.pop();
        if(pf_exp[i] == '+')
        {
            sub_result = operand1 + operand2;
        }
        else if(pf_exp[i] == '-')
        {
            sub_result = operand1 - operand2;
        }
        else if(pf_exp[i] == '*')
        {
            sub_result = operand1 * operand2;
        }
        else if(pf_exp[i] == '/')
        {
            sub_result = operand1 / operand2;
        }
        operands.push(sub_result);
    }
}

Я ожидаю, что на выходе «789--» будет «-10», но на самом деле на выходе будет «8».

1 Ответ

0 голосов
/ 30 марта 2019

Вы, вероятно, думаете о стеке как о очереди. Вы ожидаете (7 - 8) - 9 = -10, но, поскольку вы используете стек, возвращаются последние добавленные элементы, так что, как писал Бен, вы на самом деле делаете 7 - (8 - 9) = 8. Используйте вместо очереди, и измените порядок операндов, чтобы получить то, что вы на самом деле хотели.

UPDATE

Извините, мое объяснение не учитывало оценку постфикса. Как говорится в комментарии, он всегда должен использовать стек по определению. Тем не менее мой ответ, вероятно, объясняет, почему вы думали о неправильном результате.

...