了解后缀表达式评估代码

时间:2011-10-11 22:16:53

标签: c++ string stack

我试图理解这段代码。它是什么后缀表达式评估。我在理解代码时遇到了问题。如果有人能帮助我,我将非常感激。

#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
int main()
{


    //suppose a contains the string..
    //n is the length of string...
    char a[10]="A+B/C";
    int n = strlen(a)
    stack<int>s;
    for (int i=0;i<n;i++)
    {
        if (a[i]=='+')
        {
            s.push(s.pop()+s.pop());
            int temp1 = s.top();
            s.pop();
            int temp2 = s.top();
            s.pop();
            s.push(temp1 * temp2);
        }
        if (a[i]=='*')
            s.push(s.pop() * s.pop());

        if ((a[i]>='0') && (a[i]<='9'))
            s.push(0);
        while ((a[i]>='0') && (a[i]<='9'))
            s.push(10*s.pop()+(a[i++]-'0'));
    }

    cout<<s.pop()<<endl;

    return 0;
}

提前致谢。

1 个答案:

答案 0 :(得分:1)

This site看起来是关于这里发生的事情的一个很好的资源,但表达式应该使用数字,而不是字母。

假设你有中缀表达式1 + 2 * 3-4 * 5。相应的后缀将是123 * + 45 * - 。首先,您从左到右扫描字符串。前三个数字是操作数,因此它们将按顺序1(底部),2(中间),3(顶部)存储在堆栈中。接下来,有一个*运算符。为了解决这个问题,将前两个操作数从堆栈中弹出并将它们相乘(第一个弹出的是右操作数,第二个是左操作数)。这将评估为2 * 3 = 6,并且6将存储在堆栈中,使其为1,6。

接下来,有一个+运算符。弹出并添加1和6,并将7存储在堆栈中。在此之后,4和5也被推到堆叠上(7,4,5)。下一个字符是另一个*运算符,因此它计算4 * 5 = 20并将20推入堆栈(7,20)。

最后,有一个 - 运营商。弹出7和20并评估为7-20 =( - 13)。这被推到堆栈上,随时可以作为最终答案弹出。

希望这有助于消除任何混淆(假设我正确地阅读了您的问题)。