【笔记】表达式运算 栈练习
来源:互联网 发布:知乎周刊plus打包 编辑:程序博客网 时间:2024/06/03 10:08
tyvj1042 表达式计算
其实这种题,中缀转后缀才蛋疼……
先说如何计算后缀表达式:
从前往后扫表达式;若遇到数字,则扔进数字栈中。若遇到算符,则弹出栈顶的两个数字进行计算,再扔进去。最后答案是数字栈里剩下的一个数。
那么如何中缀转后缀呢?
从前往后扫表达式;若遇到数字,则直接添加进后缀表达式中。若遇到算符,则与栈顶比较(若栈为空则扔进栈中):{ 若当前算符比栈顶算符优先级高,则直接扔进栈里; 若低,则一直弹出栈顶元素并且添加进后缀表达式中,直到栈为空或者栈顶元素优先级比当前元素低。 若为左括号,则直接扔入栈中。 若为右括号,则一直弹出栈顶元素到后缀表达式中,直到栈顶元素为左括号,弹出左括号。}扫完后,把栈中元素弹出进入后缀表达式中。
我觉得这个文章讲的不错,比我说的好多了:戳我
还有就是处理负数,只要在负号前面加一个0即可(并不是平常计算用的减号)
据说有一个表达式树的东西,能把前中后缀表达式转换为表达式树的前中后序遍历,然后递归计算即可……这个大神告诉我的@loi_xczhw Orz
不过我做tyvj1043的时候,不知道是OJ出毛病还是我程序有问题,手测无误交上就WA或者RE,所以代码我就贴1042的吧…少个负数和括号的处理而已QAQ
代码:
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<stack>#include<cmath>using namespace std;typedef long long LL;LL calc(LL a,LL b,char c){ if(c=='+') return a+b; if(c=='-') return a-b; if(c=='*') return a*b; if(c=='/') return a/b; if(c=='^') return (LL)pow(a,b);}stack<LL> num;LL pri[233];LL solve(string s){ for(int i=0;i<s.length();i++) { if(s[i]>='0'&&s[i]<='9') { int x; sscanf(s.c_str()+i,"%d",&x); num.push(x); for(;i+1<s.length()&&s[i+1]>='0'&&s[i+1]<='9';i++); i++; } else { int y=num.top(); num.pop(); int x=num.top(); num.pop(); num.push(calc(x,y,s[i])); } } return num.top();}string change(string s){ string str; stack<char> oper; for(int i=0;i<s.length();i++) { if(s[i]>='0'&&s[i]<='9') { str+=s[i]; for(;i+1<s.length()&&s[i+1]>='0'&&s[i+1]<='9';i++) str+=s[i+1]; str+=" "; } else { if(oper.empty()) oper.push(s[i]); else { if(pri[s[i]]>pri[oper.top()]) { oper.push(s[i]); } else { while(oper.size()&&pri[s[i]]<=pri[oper.top()]) { char x=oper.top(); oper.pop(); str+=x; } oper.push(s[i]); } } } } while(oper.size()) { char x=oper.top(); str+=x; oper.pop(); } return str;}int main(){ pri['+']=pri['-']=1; pri['*']=pri['/']=2; pri['^']=3; string s; cin>>s; string str=change(s); cout<<str<<endl; printf("%d",solve(str)); return 0;}/*2^3+19+2*3+10/2100-1-1-1-1-1-2^45-1-1-1-1-1-2^4*/
0 0
- 【笔记】表达式运算 栈练习
- 正则表达式练习笔记
- 正则表达式练习笔记
- 20150527常量变量_练习_运算符表达式练习
- (笔记)运算符和表达式
- 报表与数据仓库运算-练习笔记
- 报表与数据仓库运算-练习笔记1
- 报表与数据仓库运算-练习笔记2
- 栈-运算后缀表达式
- 第11讲-算术运算符与算术表达式-练习
- 蓝桥杯练习系统算法训练——前缀表达式运算
- 正则表达式学习笔记3-练习
- 【JAVA学习笔记】02 运算符、表达式
- 学习笔记3 运算符与表达式
- java学习笔记02--运算符、表达式 .
- 【python学习笔记】运算符、表达式
- 表达式和运算符学习笔记
- 【python学习笔记】运算符和表达式
- Android 中的 Service 全面总结
- 【Android】【编译】Android 编译相关
- 深入Android MediaPlayer的使用方…
- 将博客搬至CSDN
- 石头剪刀布(终极版)(添加对话框循环)
- 【笔记】表达式运算 栈练习
- 使用CSS实现下拉菜单的动态显示
- STL MAP(key,value)
- c++内存对象模型(非常详细)
- JAVA 上机作业5.4
- JAVA上机——5.4
- 中序表达式转后序表达式的java实现
- 第七周-项目1 - 建立顺序环形队列算法库
- 使用uitableview的索引功能