题目链接:
题解:
同后缀表达式求值思路:
遇到数值则入栈,遇到操作符则从栈中取出最上面的两个数值进行操作,再将结果入栈,最后得到的栈顶元素则为答案。
前缀表达式从后往前遍历即可。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<stack> using namespace std; int op(char a) { if(a=='+'||a=='-'||a=='*'||a=='/') return 1; return 0; } int main() { char str1[105]; int len,i,flag=0,k=1,flagg=0; double s=0; gets(str1); len=strlen(str1); stack<double>q; for(i=len-1; i>=0; i--) //从后往前 { if(str1[i]==' ') { if(s!=0) q.push(s); flag=0,s=0,k=1; } else if(flag==0&&str1[i]>='0'&&str1[i]<='9') flag=1,s=str1[i]-'0',k=k*10; else if(flag==1&&str1[i]>='0'&&str1[i]<='9') s=s+(str1[i]-'0')*k,k=k*10; else if(flag==1&&str1[i]=='-') s=-s; else if(flag==1&&str1[i]=='.') s=s/100.0,k=1; else if(flag==0&&op(str1[i])) { double a,b,ans; a=q.top(); q.pop(); b=q.top(); q.pop(); if(str1[i]=='+') ans=a+b; else if(str1[i]=='-') ans=a-b; else if(str1[i]=='*') ans=a*b; else if(str1[i]=='/') { if(b==0) //除数为0则是ERROR flagg=1; ans=a/b; } q.push(ans); } } if(q.empty()) //最后一组样例 q.push(s); if(flagg==1||q.size()>1) printf("ERROR\n"); else printf("%.1lf\n",q.top()); return 0; }
原文:http://blog.csdn.net/axuan_k/article/details/44684797