复旦16年机考题-后缀表达式求值

首先回顾一下如何由中缀表达式转为前缀和后缀,以中缀表达式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;
}

你可能感兴趣的:(ACM)