7-5 求前缀表达式的值 (25 分)
Posted joker D888
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7-5 求前缀表达式的值 (25 分)相关的知识,希望对你有一定的参考价值。
7-5 求前缀表达式的值 (25 分)
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4
的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4
。请设计程序计算前缀表达式的结果值。
输入格式:
输入在一行内给出不超过30个字符的前缀表达式,只包含+
、-
、*
、/
以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式:
输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR
。
输入样例:
+ + 2 * 3 - 7 4 / 8 4
结尾无空行
输出样例:
13.0
结尾无空行
思路
- 创建一个栈,读入字符串后,从后往前遍历,遇到操作数入栈,遇到操作符,依次从栈中取出两个数,进行运算,将运算结果再压入栈中,直至遍历完毕,栈中只剩一个元素,取出栈顶元素输出即可
- 需要注意:操作数前面可能会到正负号和小数点,需要做相应处理
- 分母可能为0,标错,直接输出返回即可。
#include<iostream>
using namespace std;
#include<stack>
#include<string>
#include<cctype>
bool erro0 = false; //标记分母是否为0
void opr(char c,stack<double>& a)
double n1 = a.top();
a.pop();
double n2 = a.top();
a.pop();
if (c == '+')
a.push(n1 + n2);
else if (c == '-')
a.push(n1 - n2);
else if (c == '*')
a.push(n1 * n2);
else if (c == '/')
if (n2 == 0) //分母为0,ERROR
erro0 = true;
return;
else
a.push(n1 / n2);
int main(void)
string a;
getline(cin, a); //读一行,带空格
stack<double> st;
int i = a.size()-1; //从后往前读
while (i >= 0)
double x = 0; //取出的数子
int w = 1; //位数,用来标记数字所处的位数
bool num = false;
//数字
while (i>=0 && (isdigit(a[i]) || a[i] == '.' || (num && a[i] == '-') || (num && a[i] == '+')))
if (a[i] == '-') //负数
x = -x;
else if (a[i] == '.') //小数
x /= w;
w = 1; //遇到小数点后,重置w为个位
else if(isdigit(a[i])) //string->double
x = x + (a[i] - '0') * w;
w *= 10;
i--;
num = true;
//如果读到了数字,就进栈
if (num)
st.push(x);
//操作符,进行运算,运算结果进栈
if (i>=0 && (a[i] == '-' || a[i] == '+' || a[i] == '*' || a[i] == '/'))
opr(a[i], st);
if (erro0)
cout << "ERROR";
return 0;
--i;
printf("%.1lf", st.top());
return 0;
以上是关于7-5 求前缀表达式的值 (25 分)的主要内容,如果未能解决你的问题,请参考以下文章