【队内胡策 10.24 T2】术式
来源:互联网 发布:linux语言改为英文 编辑:程序博客网 时间:2024/06/05 06:10
题目来源:codevs 2178 表达式运算Cuties
去题面的传送门
表达式计算
需要处理负数以及括号多余的情况
考试的时候交的代码比较长,崩溃了好几组,后来发现应该先判断栈空。还wa了几组。
考完时候继续调,调了很久都是有bug。就是在把所有的括号都计算完了之后,剩下的运算符之前没有处理好,直接丢在栈里了。而且我是最后把栈清空了一遍,这样就导致剩下的运算符没有按照优先级排列,出现了错误答案。
比如(1+2)^(1*2)-10,把括号里的都算完之后,没有接着计算,最后变成了符号栈里的元素是^,-,数字栈里的元素是3,2,10,最后计算的结果变成了先算减号后算乘方
其实只要把整个表达式在一开始的时候就加上一对括号,每次扫到不是括号的符号,都一直计算,直到栈顶的符号的优先级比它小。因为左括号的优先级最小,所以最多会一直计算到栈底。也就是说,遇到‘-’时,先把乘方算完。我曾经想把自己有bug的程序加上这个,但是发现自己打得太麻烦了,不好改,就弃了,重新打了一份。而且,整个表达式都加上括号时,遇到最后一个右括号,就直接计算,一直到左括号结束,也就是到整个表达式结束,不用最后再清空一次栈了。
对于负数情况,如果遇到符号‘-’,它的前面是左括号,后面是数字,那么就把后面的数字变成负数加入数字栈就可以了。
注意:一开始的左括号也要加入栈中
具体看代码:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;const ll maxn=200+10;char s[maxn],sch[maxn];ll snum[maxn];ll top1,top2,l;ll cmp(char c){ if(c=='(') return 0; else if(c=='-'||c=='+') return 1; else if(c=='*'||c=='/') return 2; else if(c=='^') return 3;}ll cal(ll x,ll y,char c){ ll ret=1; if(c=='+') ret=x+y; else if(c=='-') ret=x-y; else if(c=='*') ret=x*y; else if(c=='/') ret=x/y; else if(c=='^') for(ll i=1;i<=y;++i) ret*=x; return ret;}int main(){ scanf("%s",s+1); l=strlen(s+1); s[0]='(',s[++l]=')'; sch[1]='('; ll i=0; while(i<=l) { if((s[i]=='-'&&s[i-1]=='(')||(s[i]>='0')&&s[i]<='9') { bool flg=0; if(s[i]=='-') { flg=1; i++; } ll a=0; while(s[i]>='0'&&s[i]<='9') { a=a*10+(s[i]-'0'); i++; } if(flg) a=-a; snum[++top1]=a; } else if(s[i]==')') { while(sch[top2]!='(') { ll top=cal(snum[top1-1],snum[top1],sch[top2]); top1--; top2--; snum[top1]=top; } top2--; i++; } else //if(s[i]!='(') { while(s[i]!='('&&cmp(sch[top2])>=cmp(s[i])) { ll top=cal(snum[top1-1],snum[top1],sch[top2]); top1--; top2--; snum[top1]=top; } sch[++top2]=s[i]; i++; } } printf("%lld",snum[1]); return 0;}
阅读全文
0 0
- 【队内胡策 10.24 T2】术式
- 【队内胡策 10.30】 T2
- 【队内胡策 11.1】 T1 T2
- 【队内胡策 11.3】 T1 T2
- t2
- t2
- t2
- T2
- t2
- T2
- NOIP模拟(10.24)T2 乘积
- T2-J
- T2定时器
- 10.18 T2
- NOIp2013PJ T2
- NOIp2004PJ T2
- 【11.14】T2
- T2截屏
- 程序员老鸟写sql语句的经验之谈、百万数据查询优化技巧三十则
- Tcpdump MySQL Query
- 事务的传播行为和隔离级别
- Codeforces 274D Lovely Matrix(拓扑排序+建图)
- w3af怎么使用?
- 【队内胡策 10.24 T2】术式
- ASP.NET中repeater嵌套实现代码(附源码)
- Android.mk 文件语法详解
- Spring配置XML文件命名样板
- RDBMS CLONE
- POJ系列——java
- c++ SOCKET 学习经验
- 天上掉馅饼
- windows下多个静态库合并的方法