题目描述
基本思路
无论式前缀,中缀还是后缀表达式,他的叶子节点一定是数字,非叶子节点是运算符
由于是前缀表达式,所以先有运算符,后有数字,于是我们从后往前遍历,每读完一个数字就压入栈中,当读到运算符时,就将栈顶的两个元素取出,计算结果并将值压入栈中,最终栈内剩下的一个元素就是最终答案。
代码
#include<iostream>
#include<stack>
using namespace std;
stack<double>stk;
bool calc(char c)
{
double a,b;
a=stk.top();stk.pop();
b=stk.top();stk.pop();
if(c=='+')a+=b;
if(c=='-')a-=b;
if(c=='*')a*=b;
if(c=='/')
{
if(b==0)return false;
else a/=b;
}
stk.push(a);
return true;
}
int main()
{
string s;
getline(cin,s);//读取一整行的字符串
for(int i=s.size()-1;i>=0;i--)//倒序遍历
{
if(s[i]==' ')continue;//特判一下空格的情况
else if(isdigit(s[i]))//如果是数字的话
{
double mul=10,num=s[i]-'0';//用于计算小数的
for(int j=i-1;j>=0;j--)
{
if(isdigit(s[j]))//数字
{
num+=(s[j]-'0')*mul;//此时的情况为 ,假如 s[i]=4,s[i-1]=5 54*6的情况
mul*=10;
}
else if(s[j]=='.')//此时情况为 s[i]=4,s[i-1]='.' .4*6 此时4要变到小数位置
{
num/=mul;
mul=1;
}
else if(s[j]=='-')//负数
{
num*=-1;
}
else
{
i=j;break;
}
}
stk.push(num);
}
else //运算符
{
if(!calc(s[i]))//错误的情况
{
cout<<"ERROR";
return 0;//直接退出
}
}
}
printf("%.1f",stk.top());
return 0;
}