栈运用的模板题,对于符号进行出入栈操作,每次与栈顶的符号进行优先级判断,得出第一行后缀表达式。

在其后的化简计算中,每次用一个特殊符号(代码中使用了'?')代替原来的计算结果引用,并开一个数组表示每次的计算结果,之后搜索到'?'时用这个结果进行代入计算。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

直到只剩下一个数字,停止程序。

  1 /*
  2 Written By. StelaYuri
  3 */
  4 #include<iostream>
  5 #include<cstring>
  6 #include<cmath>
  7 #include<stack>
  8 using namespace std;
  9 int rplans[100010];
 10 char ans[100010];
 11 bool mns[100010];
 12 int lv(char c){
 13     switch(c){
 14         case '+':return 1;
 15         case '-':return 1;
 16         case '*':return 2;
 17         case '/':return 2;
 18         case '^':return 3;
 19         case '(':return 0;
 20         case ')':return 0;
 21     }
 22 }
 23 int main(){
 24     ios::sync_with_stdio(0);
 25     cin.tie(0);cout.tie(0);
 26     stack<char> skc;
 27     char c;
 28     int fh=0,fs=0,cnt=0,i,j,k,a1,a2;
 29     while((c=getchar())!=EOF&&c!='\n'){
 30         if(c>='0'&&c<='9'){
 31             if(fs){
 32                 mns[cnt]=true;
 33                 fs=0;
 34             }
 35             else
 36                 mns[cnt]=false;
 37             ans[cnt++]=c;
 38             fh=0;
 39         }
 40         else{
 41             if(c==')'){
 42                 while(skc.top()!='('){
 43                     ans[cnt++]=skc.top();
 44                     skc.pop();
 45                 }
 46                 skc.pop();
 47             }
 48             else{
 49                 if(c=='('||c=='^')
 50                     skc.push(c);
 51                 else{
 52                     if(c=='-'&&fh)
 53                         fs=1;
 54                     else{
 55                         while(!skc.empty()&&lv(skc.top())>=lv(c)){
 56                             ans[cnt++]=skc.top();
 57                             skc.pop();
 58                         }
 59                         skc.push(c);
 60                     }
 61                 }
 62                 fh=1;
 63             }
 64         }
 65     }
 66     while(!skc.empty()){
 67         ans[cnt++]=skc.top();
 68         skc.pop();
 69     }
 70     cout<<ans[0];
 71     for(i=1;i<cnt;i++)
 72         cout<<' '<<ans[i];
 73     cout<<endl;
 74     for(i=0;i<(cnt-1)/2;i++){
 75         for(j=2;j<cnt;j++)
 76             if(ans[j]=='+'||ans[j]=='-'||ans[j]=='*'||ans[j]=='/'||ans[j]=='^')
 77                 break;
 78         for(k=j-1;k>=0;k--)
 79             if(ans[k]>='0'&&ans[k]<='9'||ans[k]=='!')
 80                 break;
 81         if(ans[k]!='!')
 82             a1=(ans[k]-'0')*(mns[k]?-1:1);
 83         else
 84             a1=rplans[k];
 85         ans[k]='?';
 86         for(k--;k>=0;k--)
 87             if(ans[k]>='0'&&ans[k]<='9'||ans[k]=='!')
 88                 break;
 89         if(ans[k]!='!')
 90             a2=(ans[k]-'0')*(mns[k]?-1:1);
 91         else
 92             a2=rplans[k];
 93         ans[k]='?';
 94         if(ans[j]=='+')
 95             rplans[j]=a2+a1;
 96         else if(ans[j]=='-')
 97             rplans[j]=a2-a1;
 98         else if(ans[j]=='*')
 99             rplans[j]=a2*a1;
100         else if(ans[j]=='/')
101             rplans[j]=a2/a1;
102         else
103             rplans[j]=pow(a2,a1);
104         ans[j]='!';
105         for(j=k=0;j<cnt;j++){
106             if(ans[j]!='?'){
107                 if(k)
108                     cout<<' ';
109                 if(ans[j]=='!')
110                     cout<<rplans[j];
111                 else
112                     cout<<ans[j];
113                 k=1;
114             }
115         }
116         cout<<endl;
117     }
118     return 0;
119 }
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄