首先回顾一下如何由中缀表达式转为前缀和后缀,以中缀表达式9+(5-4)-6+7为例。
转为后缀表达式的规则
从左到右扫描中缀表达式,
若遇到数字,则将其输出。
若遇到运算符,
1.若为“(”则将其入栈。
2.若此时栈为空或者栈顶为"(",则将其入栈。
3.当前运算符优先级大于栈顶运算符优先级,则将其入栈,反之(也就是小于等于),则一直将栈顶运算符出栈,直到当前运算符优先级大于栈顶运算符优先级为止。
4.若当前运算符为“)”,则一直出栈,直到遇到(停止。(左括号出栈,但是不输出到后缀表达式中)
5.若中缀式扫描结束后栈不为空,则将栈中元素依次出栈并输出到后缀式中。根据后缀式求值
根据上述规则得到的后缀式是:954-+6-7+。根据后缀式求值的规则是,从左到右扫描后缀式,若为数字,则入栈,若为运算符,则从栈中弹出两个操作数,先弹出的作为右操作数,后弹出的为左操作数,根据当前运算符运算之后将值入栈。
转为前缀表达式的规则
从右到左扫描中缀表达式,
若遇到数字,则将其输出。
若遇到运算符,
1.若为“)”则将其入栈。
2.若此时栈为空或者栈顶为")",则将其入栈。
3.当前运算符优先级大于等于栈顶运算符优先级,则将其入栈,反之(也就是小于),则一直将栈顶运算符出栈,直到当前运算符优先级大于等于栈顶运算符优先级为止。
4.若当前运算符为“(”,则一直出栈,直到遇到)停止。(右括号出栈,但是不输出到前缀表达式中)
5.若中缀表达式扫描结束后,栈不为空,则将栈中元素依次弹出,输出到前缀式中。
6.最后将其逆置就是最终的前缀式。根据前缀式求值
根据上述规则得到的前缀式是:+ -+9-5467。根据前缀式求值的规则是,从右到左扫描前缀式,若为数字,则入栈,若为运算符,则从栈中弹出两个操作数,先弹出的作为左操作数,后弹出的为右操作数,根据当前运算符运算之后将值入栈。
#include <iostream>
#include <string>
#include <stack>
using namespace std;
stack<int> s;
//954-+6-7+
int main()
{
string str;
while(cin >> str)
{
if(!s.empty())
s.pop();
for(int i = 0; i < str.length(); i++)
{
if(str[i] >= '0' && str[i] <= '9')
s.push(str[i]-'0');
else
{
int x1 = s.top();
s.pop();
int x2 = s.top();
s.pop();
if(str[i] == '-')
s.push(x2-x1);
else
s.push(x2+x1);
}
}
cout << s.top() << endl;
}
return 0;
}