蓝桥杯 算法训练 表达式的计算(中缀转后缀表达式求值)
来源:互联网 发布: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
- 蓝桥杯 算法训练 表达式的计算(中缀转后缀表达式求值)
- 蓝桥杯 算法训练:表达式计算 中缀表达式变后缀表达式
- 中缀表达式转后缀表达式 (中缀表达式的计算)
- 表达式求值(中缀转后缀及后缀表达式求值)
- 表达式计算(中缀转后缀,然后求值)
- 中缀表达式转后缀表达式求值(栈的应用)
- 栈的应用--算术表达式的求值(中缀转后缀然后计算后缀表达式的值)
- 中缀表达式求值、后缀表达式求值、中缀转后缀、前缀
- 中缀表达式转后缀,以及后缀表达式的求值
- 中缀 后缀表达式求值
- 中缀表达式转后缀表达式及后缀表达式的计算
- 中缀表达式转后缀表达式并求值
- 中缀表达式转后缀表达式求值
- 中缀表达式转后缀表达式并求值
- 中缀表达式转后缀表达式求值
- 中缀表达式转后缀表达式并求值
- 中缀表达式转后缀表达式并求值
- 中缀表达式转后缀表达式 求值
- <noip>陶陶摘苹果
- hashCode与equals的区别与联系
- Android资源管理框架(Asset Manager)
- postgresql中创建新用户等各种命令
- Unknown integral data type for ids : java.lang.String; nested exception is org.hibernate.id.Identifi
- 蓝桥杯 算法训练 表达式的计算(中缀转后缀表达式求值)
- D
- Centos7网络设置
- Version 1.7.0_121 of the JVM is not suitable for this product. Version: 1.8
- 安卓内存泄露几种常见形式及解决方案
- dfs序(HDU 5296,Annoying problem)
- 未来的程序员还会有今天的收入吗?
- 最长回文子串 C++
- Android视图SurfaceView