【队内胡策 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;}
原创粉丝点击