#include<iostream> #include<stack> #include<cmath> using namespace std; char ch; bool f(char t) { if(t=='+'||t=='-'||t=='*'||t=='/'||t=='('||t==')'||t=='=') return 1; return 0; } double cal(double t1,double t2,char c) { switch(c) { case '+':return t1+t2; case '-':return t1-t2; case '*':return t1*t2; case '/':return t1/t2; } return 0; } int cmp(char t1,char t2) { int q1=0,q2=0; switch(t1) { case '+':q1=1;break; case '-':q1=1;break; case '*':q1=2;break; case '/':q1=2;break; case '(':q1=0;break; case ')':q1=-1;break; } switch(t2) { case '+':q2=1;break; case '-':q2=1;break; case '*':q2=2;break; case '/':q2=2;break; case '(':q2=0;break; case ')':q2=-1;break; } if(q1==-1&&q2==0) return 0; if(q1>q2) return 2; if(q1<=q2) return 1; return -1; } double z() { double ans=0; int a[1000],i=0,flag=0; a[++i]=ch-'0'; while(cin>>ch&&!f(ch)) { if(ch=='.') { flag=i; continue; } a[++i]=ch-'0'; } if(flag==0) flag=i; for(int j=1;j<=i;j++) { ans+=a[j]*pow(10,flag-j); } return ans; } int main() { stack<double> OPND;//存放数字 stack<char> OPTR;//存放运算符 double t1,t2,t3; while(cin>>ch&&ch!='=') { if(f(ch)) { OPTR.push(ch); cin>>ch; } else { OPND.push(z()); } while(ch!='=') { if(f(ch)) { if(OPTR.empty()) { OPTR.push(ch); cin>>ch; continue; } if(cmp(ch,OPTR.top())==1)//后出现的优先级小,存储 { OPTR.push(ch); cin>>ch; continue; } else if(cmp(ch,OPTR.top())==2)//后出现的优先级大,计算 { char c1=ch; cin>>ch; t2=z(); t1=OPND.top(); OPND.pop(); t3=cal(t1,t2,c1); OPND.push(t3); } else { OPTR.pop(); cin>>ch; } } else { OPND.push(z()); } } while(!OPTR.empty()) { ch=OPTR.top(); OPTR.pop(); t2=OPND.top(); OPND.pop(); t1=OPND.top(); OPND.pop(); t3=cal(t1,t2,ch); OPND.push(t3); } printf("%.2lf ",OPND.top()); OPND.pop(); getchar(); } return 0; }
重点大概在于数据接收