C++ 前缀表达式求值递归版本

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 <iostream>
#include <string>
#include <cstring>
using namespace std;

double exp()
{
	char s[35];
	cin >> s;
	switch (s[0])
	{
	case '+':
		return exp() + exp();
	case '-':
		return exp() - exp();
	case '*':
		return exp() * exp();
	case '/':
		return exp() / exp();
	default:
		return atof(s);
	break;
	}
}

int main()
{
	printf("%.1f\n", exp());
	return 0;
}

但是其中有三个问题,分别是分母为0,输入带符号的数,处理符号

#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;

float f()
{
	char A[31];
	cin >> A;
	if (A[1] == NULL)
	{
		switch (A[0])
		{
		case'*': return f()*f();
		case'/':
		{
			float fenzi, fenmu;
			fenzi = f();
			fenmu = f();
			// 分母为0的情况
			if (fenmu == 0)
			{
				cout << "ERROR" << endl;
				exit(0);
			}
			else return fenmu / fenzi;
		}
		case'-': return f() - f();
		case'+': return f() + f();
		default: return atof(A);
		}
	}

	else
	{   
		// 如果出现负数的情况或十位以上数的情况
		// 如果有符号,去掉符号
		if (A[0] == '+' || A[0] == '-')
		{
			char flag = A[0];
			int i = 0;
			while (A[i])
			{
				A[i] = A[i + 1];
				i++;
			}
			if (flag == '-')
				return 0 - atof(A);
			else
				return atof(A);
		}
		// 如果无符号
		else return atof(A);
	}
};
int main()
{

	float Sum;
	Sum = f();
	cout << fixed << setprecision(1) << Sum << endl;

	return 0;
}

猜你喜欢

转载自blog.csdn.net/wwxy1995/article/details/82854138