PAT 求前缀表达式的值

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

输入格式:

输入在一行内给出不超过30个字符的前缀表达式,只包含+-*\以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

输出格式:

输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR

输入样例:

+ + 2 * 3 - 7 4 / 8 4

输出样例:

13.0

分析:1.从后往前,遇到数字入栈,遇到运算符时,从栈里取出两个数字进行计算,把结果再入栈。 

           2.遇到那两位以上的数字处理str.substr(i,j)(获得字符串i到j之间的子字符串),stod(st)(将字符串转换为double型)。

#include<string>
#include<iostream>
#include<stack>
using namespace std;
string str;
int i;
stack<double>s;
void getnumber()//获得数字 
{
	int j = i;
	while (j >= 0 && str[j] != ' ') j--;
	s.push(stod(str.substr(j + 1, i - j)));
	i = j;
}
bool cmp(double a, char c, double b, double &d)
{
	switch (c)
	{
	case '+':d = a + b; break;
	case '-':d = a - b; break;
	case '*':d = a*b; break;
	case '/':
		if (b == 0) return 0;
		else
			d = a / b;
 	}
	return 1;
}
int main()
{
	int flag = 0;
	getline(cin, str);
	i = str.length()-1;
	while (i >= 0)
	{
		if (str[i] == ' ') i--;
		else if (str[i] >= '0'&&str[i] <= '9')
			getnumber();
		else
		{
			double a = s.top(); s.pop();
			double b = s.top(); s.pop();
			double d;
			if (!cmp(a, str[i], b, d))
			{
				cout << "ERROR";
				flag = 1;
				i--;
			}
			else
			{
				s.push(d);
				i--;
			}	
		}
	}
	if (!flag)
		printf("%.1f", s.top());
	return 0;

}

猜你喜欢

转载自blog.csdn.net/Fcity_sh/article/details/81479682