中綴表示式轉為字尾表示式以及求值
阿新 • • 發佈:2018-12-15
程式碼裡有註釋。。。直接上程式碼。。。
#include<bits/stdc++.h> #define rep(i,k,n) for(int i=k;i<=n;i++) #define per(i,n,k) for(int i=n;i>=k;i--) #define pii pair<int,int> #define pb push_back #define mp make_pair #define ll long long #define re return #define se second #define fi first using namespace std; //---------------------------------------------------------------head---------------------------------------------------------------------- stack<int> si; stack<char> sc; vector<int> vc; bool isnum[1005]; int clas(char c)//符號優先順序 { if(c=='(' || c==')') re 0; if(c=='+' || c=='-') re 1; if(c=='*' || c=='/') re 2; if(c=='^') re 3; re 4; } int cal(int a,int b,char c)//符號求值 { int ans=1; if(c=='+') re a+b; if(c=='-') re b-a; if(c=='*') re a*b; if(c=='/') re b/a; rep(i,1,a) ans*=b; re ans; } int main() { string s;cin>>s; s="("+s+")";//可以用來防止棧為空找top時的溢位情況 int n=(int)s.size(); rep(i,0,n-1) { if(s[i]=='(')//左括號直接壓入 { sc.push(s[i]); continue; } if(s[i]==')')//找到右括號將棧清空到左括號為止 { char c=sc.top();sc.pop(); while(c!='(') { vc.pb(c); c=sc.top();sc.pop(); } continue; } if(s[i]>='0' && s[i]<='9')//數字 { int sum=0; while(s[i]>='0' && s[i]<='9') sum=sum*10+s[i++]-'0'; vc.pb(sum); isnum[vc.size()-1]=1; i--;continue; } while(!sc.empty() && clas(s[i])<=clas(sc.top()))//如果是符號就找到第一個優先順序比他小的 vc.pb(sc.top()),sc.pop(); sc.push(s[i]); } while(!sc.empty())//清空棧 vc.pb(sc.top()),sc.pop(); rep(i,0,vc.size()-1)//根據字尾表示式求值 { if(!isnum[i]) { int a=si.top();si.pop(); int b=si.top();si.pop(); int ans=cal(a,b,vc[i]); si.push(ans); } else si.push(vc[i]); } cout<<si.top(); return 0; } //----------------------------------------------------------------end----------------------------------------------------------------------