#include <iostream> #include <stack> #include <cstio> #include <cstring> using namespace std; stack <float> data; stack <char> symbol; int b[5][6]; int change(char a){ int symbol_index; switch(a){ case '+':symbol_index=1;break; case '-':symbol_index=2;break; case '*':symbol_index=3;break; case '/':symbol_index=4;break; case '@':symbol_index=5;break; } return symbol_index; } int main(){ memset(b,0,sizeof(b)); b[3][1]=b[3][2]=b[4][1]=b[4][2]=b[1][5]=b[2][5]=b[3][5]=b[4][5]=1; string a; cin >> a; symbol.push('@'); float index=0; for(int i=0;i<a.length();i++){ if(a[i]=='#'){ data.push(index); break; } if(a[i]<='9'&&a[i]>='0'){ index*=10; index+=a[i]-'0'; } else{ data.push(index); index=0; int symbol_index; symbol_index=change(a[i]); while(b[symbol_index][change(symbol.top())]==0){ float b=data.top(); data.pop(); float a=data.top(); data.pop(); switch(symbol.top()){ case '+':data.push(a+b);break; case '-':data.push(a-b);break; case '/':data.push(a/b);break; case '*':data.push(a*b);break; } symbol.pop(); } symbol.push(a[i]); } } while(symbol.top()!='@'){ float b=data.top(); data.pop(); float a=data.top(); data.pop(); switch(symbol.top()){ case '+':data.push(a+b);break; case '-':data.push(a-b);break; case '/':data.push(a/b);break; case '*':data.push(a*b);break; } symbol.pop(); } printf("%.4f",data.top()); return 0; }
思路
先讀入,再循環
如果是數據,將index變量×10+數據。
如果是運算符:
先將index壓入棧data中,再將index歸零。
然后將運算符轉換成運算符代碼,參見附表1。
然后分兩種情況:
1. symbol棧棧頂運算符優先級沒此運算符高:直接壓棧。
2. 否則取出symbol棧棧頂和data棧棧頂(b)和新的棧頂(取出后棧頂后新的棧頂,即取出前從上往下排第二的元素)(a)進行運算,然后再分兩種情況考慮。
如果是#:index壓棧,退出循環。然后把剩下的計算完。參見2。
犯的錯誤
1. 除法應用float類型,我寫成int了。
2. 棧改成int后,其他變量沒改。
3. #時,index沒入棧。(思路中已糾正)。
收獲
1. 注意類型。
2. 結束時不要想當然地結束循環,而應思考一下還有什么操作。