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

来源:互联网 发布:linux启动流程分析 编辑:程序博客网 时间:2024/05/22 15:16

算法训练 表达式计算  
时间限制: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<iostream>#include<map>#include<cstring>#include<string>#include<stack>using namespace std;stack<char>s1,s2;//符号栈,数字栈 stack<int>s3,s4;//结果栈,s2的反转栈 char ss[111]; map<char,int>mp;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;i<s.size();i++){if(isdigit(s[i]))//如果是数字的话 {s2.push(s[i]);//直接入栈//如果下一个字符不是数字或者是最后一个数字 if(i==s.size()-1||!isdigit(s[i+1])){s2.push('#');} }else{//如果符号栈为空,或者是(或者优先级大于栈顶元素的优先级 if(s1.empty()||s[i]=='('||(mp[s[i]]>mp[s1.top()])){//cout<<s2.empty()<<" "<<mp[s[i]]<<" "<<mp[s2.top()]<<endl;s1.push(s[i]);}//如果是),弹栈到s1直到遇到(,并且压栈到s2 else if(s[i]==')'){while(s1.top()!='('){s2.push(s1.top());s1.pop();}s1.pop();}//如果优先级小于等于栈顶元素的优先级else{//注意栈空 while(!s1.empty()&&mp[s[i]]<=mp[s1.top()]){s2.push(s1.top());s1.pop();} s1.push(s[i]);} } }//将符号栈唯一的一个符号压如数字栈 while(!s1.empty()){s2.push(s1.top());s1.pop();}cout<<intopost()<<endl;; return 0; } 


0 0
原创粉丝点击