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 分)的主要内容,如果未能解决你的问题,请参考以下文章

7-21 求前缀表达式的值

前缀,中缀,后缀表达式求值

1012 The Best Rank (25 分)难度: 中 / 知识点: 排序 前缀和

5-20 表达式转换 (25分)

7-1 表达式转换 (25 分)

09 - 逆波兰计算器