蓝桥杯 算法训练 表达式的计算(中缀转后缀表达式求值)

算法训练 表达式计算  
时间限制:1.0s   内存限制:256.0MB
    
问题描述
  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
  输入一行,包含一个表达式。
输出格式
  输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
  表达式长度不超过100,表达式运算合法且运算过程都在int内进行。

tips:stephon 的PPT还有表格画的还是可以的。详细思路可以参见博客http://blog.csdn.net/reidsc/article/details/54669433

需要注意的几点:

1.分清楚操作符前后操作数的顺序

2.对栈空的特殊判断

3.数位大于1的数,求后缀的处理,以及通过后缀求表达式值的处理。

4.优先级的预处理我使用了map进行了预处理。

#include
#include
#include
#include
#include
using namespace std;
stacks1,s2;//符号栈,数字栈 
stacks3,s4;//结果栈,s2的反转栈 
char ss[111]; 
mapmp;
int intopost()
{
	//s4为s2的反转栈 
	while(!s2.empty()){
		s4.push(s2.top());s2.pop(); 
	}
	while(!s4.empty())
	{
		char ch=s4.top();s4.pop();
		//如果是# 
		if(ch=='#')continue;
		//如果是数字 
		else if(isdigit(ch))
		{
			int tmp=ch-'0';
			while(isdigit(s4.top()))
			{
				tmp=tmp*10+(s4.top()-'0');s4.pop();
			}
			s3.push(tmp);
		}
		//否则的话肯定是运算符 
		else{
			int x=s3.top();s3.pop();
			int y=s3.top();s3.pop();
			//次顶元素 Operaor 栈顶元素	
			if(ch=='+')s3.push(y+x);
			else if(ch=='-')s3.push(y-x);
			else if(ch=='*')s3.push(y*x);
			else s3.push(y/x); 
		} 
	}
	return s3.top();
}
int main()
{
	//预处理各个符号的优先级 
	mp['*']=mp['/']=3;
	mp['+']=mp['-']=2;
	mp['(']=mp[')']=1;
	cin>>s; 
	for(int i=0;imp[s1.top()]))
			{
				//cout<


你可能感兴趣的:(蓝桥杯,STL)