算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4
的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4
。请设计程序计算前缀表达式的结果值。
输入格式:
输入在一行内给出不超过30个字符的前缀表达式,只包含+
、-
、*
、/
以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式:
输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR
。
输入样例:
+ + 2 * 3 - 7 4 / 8 4
结尾无空行
输出样例:
13.0
结尾无空行
方式:利用堆栈,实现前缀表达式的运算
1. 因为不同对象(运算数、运算符号)之间以空格分隔。而且输入只有一行,所以可以先用string把每一项读入并入栈(可以先命名为S stack<string> S;)。
2. 所有项都读入完之后,开始访问每一个S栈顶元素
(1)如果 S栈顶是数字,就把该元素转成double类型,再压入新的栈中(可以先命名为D stack<double> D;)
(2)如果S栈顶是字符(也就是4个运算符号),就访问D栈顶中的两个元素,并出栈,然后根据运算符号的意思进行相应的运算,再把运算的结果再压到栈D中。
(3)最后栈D中剩下的最后一个就是求的结果。
注意!!!
(1)数字不止有一位,可以是多位数。
(2)数字也可以是小数
(3)数字前面可能带正负号
(4)当除数为0的时候要返回 ERROR
#include <bits/stdc++.h>
using namespace std;
int main()
{
int flag=1;
string a;
stack<string> d;
stack<double> b;
while (cin >> a) d.push(a);//入栈
while(!d.empty())
{
a=d.top();
if (a.size() == 1)
{
if (a[0] >= '0' && a[0] <= '9')//一位数的时候
{
b.push(a[0] - '0');
}
else //栈顶是4个运算符号的时候
{
double s=b.top();
b.pop();
double k=b.top();
b.pop();
if(a[0]=='-') b.push(s-k);
else if(a[0]=='+') b.push(s+k);
else if(a[0]=='*') b.push(s*k);
else if(a[0]=='/'){
if(k==0) {flag=0;break;}else b.push(s/k);
}
//cout<<'('<<s<<','<<k<<')'<<b.top()<<endl;
}
}
else
{
if (a[0] >= '0' && a[0] <= '9')//多位数、小数的时候
{
b.push(stod(a)); //stod()函数把string转成double
}
else//带正负号的时候
{
string p = a;
a.erase(0, 1);
if (p[0] == '-')
{
double k = 0 - (stod(a));
b.push(k);
}
else
{
b.push(stod(a));
}
}
}
d.pop();
}
if(!flag) cout<<"ERROR";
else printf("%.1lf",b.top());
return 0;
}