算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4
的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4
。请设计程序计算前缀表达式的结果值。
输入格式:
输入在一行内给出不超过30个字符的前缀表达式,只包含+
、-
、*
、\
以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式:
输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR
。
输入样例:
+ + 2 * 3 - 7 4 / 8 4
输出样例:
13.0
分析:1.从后往前,遇到数字入栈,遇到运算符时,从栈里取出两个数字进行计算,把结果再入栈。
2.遇到那两位以上的数字处理str.substr(i,j)(获得字符串i到j之间的子字符串),stod(st)(将字符串转换为double型)。
#include<string>
#include<iostream>
#include<stack>
using namespace std;
string str;
int i;
stack<double>s;
void getnumber()//获得数字
{
int j = i;
while (j >= 0 && str[j] != ' ') j--;
s.push(stod(str.substr(j + 1, i - j)));
i = j;
}
bool cmp(double a, char c, double b, double &d)
{
switch (c)
{
case '+':d = a + b; break;
case '-':d = a - b; break;
case '*':d = a*b; break;
case '/':
if (b == 0) return 0;
else
d = a / b;
}
return 1;
}
int main()
{
int flag = 0;
getline(cin, str);
i = str.length()-1;
while (i >= 0)
{
if (str[i] == ' ') i--;
else if (str[i] >= '0'&&str[i] <= '9')
getnumber();
else
{
double a = s.top(); s.pop();
double b = s.top(); s.pop();
double d;
if (!cmp(a, str[i], b, d))
{
cout << "ERROR";
flag = 1;
i--;
}
else
{
s.push(d);
i--;
}
}
}
if (!flag)
printf("%.1f", s.top());
return 0;
}