算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。
输入格式:
输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、/以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式:
输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR。
输入样例:
+ + 2 * 3 - 7 4 / 8 4
输出样例:
13.0
#include<iostream>
#include<cstring>
#include<stack>
#include<stdio.h>
const int MAX = 31;
using namespace std;
int main()
{
char str[MAX];
cin.getline(str,MAX);
int len = strlen(str);
stack<double> st1;
for(int i = len-1;i>=0;i--)
{
if(str[i] == ' ')
{
continue;
}
if(str[i]>='0'&&str[i]<='9')
{
double mul = 10,num = str[i] - '0';
for(i--;i>=0;i--)
{
//处理num为大于10的数
if(str[i]>='0'&&str[i]<='9')
{
num = num + (str[i]-'0')*mul;
mul *= 10;
}
//num为小数
else if(str[i]=='.')
{
num /= mul;
mul = 1;
}
//num为负数
else if(str[i]=='-')
{
num = -num;
}
else
{
break;
}
}
st1.push(num);
}
else
{
double temp = st1.top();
st1.pop();
if(str[i] == '*')
{
temp *= st1.top();
st1.pop();
}
else if(str[i] == '/')
{
if(st1.top() == 0)
{
cout << "ERROR"<<endl;
return 0;
}
temp /= st1.top();
st1.pop();
}
else if(str[i] == '+')
{
temp += st1.top();
st1.pop();
}
else
{
temp -= st1.top();
st1.pop();
}
st1.push(temp);
}
}
printf("%.1lf",st1.top());
return 0;
}