表示式求值運算(逆波蘭式)
阿新 • • 發佈:2019-02-06
逆波蘭式:中綴表示式,字尾表示式等內容可百度檢視。
運算表示式 2+3*(1+2)-6/3
開兩個棧,一個存數字,一個存符號。
當 遇到這種情況1:需要先計算後面的內容,再回來計算前面的運算
讓符號進棧暫時儲存。
還有一種情況2:遇到左括號時,只能進棧等待右括號的到來。右括號到來時,運算整個括號內的內容。
其他情況,都可直接計算。
【程式碼】
#include<bits/stdc++.h> using namespace std; void cal(stack<int> &S1,stack<char> &S2)//進行一次運算 { int b=S1.top();S1.pop(); int a=S1.top();S1.pop(); char ch=S2.top();S2.pop(); int ans; if(ch=='+')ans=a+b; if(ch=='-')ans=a-b; if(ch=='*')ans=a*b; if(ch=='/')ans=a/b; S1.push(ans); } bool compare(char l,char r)//l<r return 1 入棧 { if(l=='('||r=='(')return 1; if((l=='+'||l=='-')&&(r=='*'||r=='/')) return 1; return 0; } int main() { cout<<"輸入表示式:\n"; string s; cin>>s; stack<int>S1; stack<char>S2; for(int i=0;i<s.length();i++) { int x=0,flag=0; while(s[i]>='0'&&s[i]<='9') x=x*10+s[i++]-'0',flag=1; if(flag) S1.push(x); if(i>=s.length())break; if(s[i]==')')//遇 ) 則運算整個括號 { while(S2.top()!='(') cal(S1,S2); S2.pop(); } else { while((!S2.empty())&&(!compare(S2.top(),s[i])))//計算 cal(S1,S2); S2.push(s[i]); } } while(!S2.empty())//棧中剩餘運算子運算 cal(S1,S2); cout<<S1.top()<<endl; }