题目链接:
题解:
同后缀表达式求值思路:
遇到数值则入栈,遇到操作符则从栈中取出最上面的两个数值进行操作,再将结果入栈,最后得到的栈顶元素则为答案。
前缀表达式从后往前遍历即可。
代码:
#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