我试图理解这段代码。它是什么后缀表达式评估。我在理解代码时遇到了问题。如果有人能帮助我,我将非常感激。
#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;
}
提前致谢。
答案 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)。这被推到堆栈上,随时可以作为最终答案弹出。
希望这有助于消除任何混淆(假设我正确地阅读了您的问题)。