7-21 求前缀表达式的值 (25 分)
传送门:
题目要求:
- 算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。
输入格式:
- 输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、/以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式:
- 输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR。
输入样例:
+ + 2 * 3 - 7 4 / 8 4
输出样例:
13.0
思路重现:
- 前缀表达式的求值:从前缀表达式的最右边开始向左遍历,碰到数值压入栈中,碰到运算符将栈顶的两个元素出栈并进行相应的运算,在运算完之后在压入栈,以便后边的操作。然后通过模拟的方式进行实现代码。
代码实现:
#include<bits/stdc++.h>
using namespace std;
string a[100];
int main()
{
stack<double> s;
char c;
double b,d;
int i = 0;
int flag = 0;//标记是否错误
while(1)
{
cin>>a[i++];
c = getchar();
if(c == '\n')
break;
}
i--;
for(int j = i;j >= 0;j--)
{
if(a[j] == "+" || a[j] == "-" || a[j] == "*" || a[j] == "/")
{
if(s.size() < 2)//第一个错误点:当出现运算符时,栈元素不足与用来运算。
{
flag = 1;
break;
}
b = s.top();
s.pop();
d = s.top();
s.pop();
if(a[j] == "+")
{
s.push(b+d);
}
else if(a[j] == "-")
{
s.push(b-d);
}
else if(a[j] == "*")
{
s.push(d*b);
}
else if(a[j] == "/")
{
if(d == 0)//第二个坑点:除数为0.
{
flag = 1;
break;
}
s.push(b/d);
}
}
else
{
stringstream ss;//用string流将string转换成double。
ss<<a[j];
ss>>b;
s.push(b);
}
}
if(s.size()!=1)//第三个坑点:最后输出的时候栈里元素个数多于1。
{
flag = 1;
}
if(flag)
cout<<"ERROR";
else
printf("%.1f",s.top());
return 0;
}
版权声明:本文为qq_45754630原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。