#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. 结束时不要想当然地结束循环,而应思考一下还有什么操作。