P1175 表示式的轉換
阿新 • • 發佈:2022-12-13
P1175 表示式的轉換
題目簡述
給定常規的表示式,將其改寫為字尾表示式並把每個中間過程進行的運算結果依次輸出
思路
思維難度不大,畢竟資料量比較小,暴力就行了,但碼量還是有一點的,程式碼有點醜,日後有機會可以嘗試重新寫一遍
程式碼
#include<bits/stdc++.h> using namespace std; const int N=105; char s[N]; int len,md[N],kdl; char _s[N][N]; int cal(int sta){ int kdl=0; for(int i=sta;i;i++){ if(s[i]=='(')kdl++; if(s[i]==')')kdl--; if(kdl==0)return i; } } void work(int l,int r){ if(l>r)return ; switch(s[l]){ case '+':{ for(int i=l+1;i<=r;){ if(s[i]=='+'||s[i]=='-'){ work(l+1,i-1); _s[1][++len]='+'; work(i,r); return ; } else { if(s[i]=='(')i=cal(i)+1; else i++; } } work(l+1,r); _s[1][++len]='+'; return ; } case '-':{ for(int i=l+1;i<=r;){ if(s[i]=='+'||s[i]=='-'){ work(l+1,i-1); _s[1][++len]='-'; work(i,r); return ; } else { if(s[i]=='(')i=cal(i)+1; else i++; } } work(l+1,r); _s[1][++len]='-'; return ; } case '/':{ for(int i=l+1;i<=r;){ if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){ work(l+1,i-1); _s[1][++len]='/'; work(i,r); return ; } else { if(s[i]=='(')i=cal(i)+1; else i++; } } work(l+1,r); _s[1][++len]='/'; return ; } case '*':{ for(int i=l+1;i<=r;){ if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){ work(l+1,i-1); _s[1][++len]='*'; work(i,r); return ; } else { if(s[i]=='(')i=cal(i)+1; else i++; } } work(l+1,r); _s[1][++len]='*'; return ; } case '^':{ for(int i=l+1;i<=r;){ if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){ work(l+1,i-1); _s[1][++len]='^'; work(i,r); return ; } else { if(s[i]=='(')i=cal(i)+1; else i++; } } work(l+1,r); _s[1][++len]='^'; return ; } case '(':{ work(l+1,cal(l)-1); work(cal(l)+1,r); return ; } } _s[1][++len]=s[l]; work(l+1,r); return ; } int main(){ scanf("%s",s+1); work(1,strlen(s+1)); for(int i=1;i<=len;i++)cout<<_s[1][i]<<' '; puts(""); for(int i=1;i<=len;i++){ if(_s[1][i]>='0'&&_s[1][i]<='9'){ md[++kdl]=_s[1][i]-'0'; continue; } switch(_s[1][i]){ case '+':{ md[kdl-1]=(md[kdl-1])+(md[kdl]); kdl--; for(int j=1;j<=kdl;j++)cout<<md[j]<<' '; for(int j=i+1;j<=len;j++)cout<<_s[1][j]<<' '; cout<<endl; break; } case '-':{ md[kdl-1]=(md[kdl-1])-(md[kdl]); kdl--; for(int j=1;j<=kdl;j++)cout<<md[j]<<' '; for(int j=i+1;j<=len;j++)cout<<_s[1][j]<<' '; cout<<endl; break; } case '*':{ md[kdl-1]=(md[kdl-1])*(md[kdl]); kdl--; for(int j=1;j<=kdl;j++)cout<<md[j]<<' '; for(int j=i+1;j<=len;j++)cout<<_s[1][j]<<' '; cout<<endl; break; } case '/':{ md[kdl-1]=(md[kdl-1])/(md[kdl]); kdl--; for(int j=1;j<=kdl;j++)cout<<md[j]<<' '; for(int j=i+1;j<=len;j++)cout<<_s[1][j]<<' '; cout<<endl; break; } case '^':{ md[kdl-1]=pow((md[kdl-1]),(md[kdl])); kdl--; for(int j=1;j<=kdl;j++)cout<<md[j]<<' '; for(int j=i+1;j<=len;j++)cout<<_s[1][j]<<' '; cout<<endl; break; } } } return 0; }