【codevs 2178】表达式运算Cuties

来源:互联网 发布:深圳岂凡网络 林秋敏 编辑:程序博客网 时间:2024/06/04 01:36

一下午的成果???

//遇到优先级小于栈顶时计算#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<stack>#include<cstring>#define ll long longusing namespace std;stack<ll>num;stack<char>f;ll len;string a,b,c;ll k[100];void cal()//无脑的计算 {        char b[1];        b[0]= f.top();        f.pop();        ll y=num.top();num.pop();//x y<-----顺序         ll x=num.top();num.pop();        if(b[0]=='+')        {            num.push(x+y);        }        else if(b[0]=='-')        {            num.push(x-y);        }        else if(b[0]=='*')        {            num.push(x*y);        }        else if(b[0]=='/')        {            num.push(x/y);        }        else if(b[0]=='^')        {            ll ret=1;            while(y--)            {                ret*=x;            }            num.push(ret);        }}int main(){    k['+']=k['-']=1;    k['*']=k['/']=2;    k['^']=3;    a="(";    cin>>b;    a+=b;    c=")";    a+=c;//前后加上括号方便运算    // cout<<a<<'\n';    ll numb=0,fu=1;//当前要压进栈的数字以及数字的正负     len=a.length();    for(ll i=0;i<len;i++)//枚举字符     {        if(a[i]=='-'&&a[i-1]=='(') fu=-1;//该数字是负数         else if(a[i]<='9'&&a[i]>='0') //记录数字的过程         {            numb*=10;            numb+=a[i]-'0';        }        else        {            if(i-1>=0&&a[i-1]<='9'&&a[i-1]>='0')//遇到运算符或者括号就把记录的数字压进栈             {                num.push(numb*fu);                 fu=1;                numb=0;            }            if(a[i]==')' )            {                while(!f.empty()&&f.top()!='(')//遇见右括号就一直向左运算到左括号                  cal();                if(!f.empty()&&f.top()=='(') f.pop();//弹掉左括号             }            else if(!f.empty()&&k[a[i]]<=k[f.top()]&&a[i]!='(')//如果当前运算符小于上一个运算符 那就先计算上一个运算符             {                while(!f.empty()&&k[a[i]]<=k[f.top()]&&a[i]!='(')                   cal();                f.push(a[i]);//再把当前运算符压入符号栈             }            else f.push(a[i]);        }    }    printf("%lld\n",num.top());}