首页 > 代码库 > 3-07. 求前缀表达式的值(25) (ZJU_PAT数学)

3-07. 求前缀表达式的值(25) (ZJU_PAT数学)

题目链接:http://pat.zju.edu.cn/contests/ds/3-07


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

输入格式说明:

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

输出格式说明:

输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”。

样例输入与输出:

序号输入输出
1
+ + 2 * 3 - 7 4 / 8 4
13.0
2
/ -25 + * - 2 3 4 / 8 4
12.5
3
/ 5 + * - 2 3 4 / 8 2
ERROR
4
+10.23
10.2


代码如下:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
char s[47];
stack<double>ss;

int is_op(char c)
{
	if(c=='+' || c=='-' || c=='*' || c=='/')
		return 1;
	return 0;
}
int main()
{
	while(gets(s))
	{
		while(!ss.empty())//清空
		{
			ss.pop();
		}
		int len = strlen(s);
		int cc = 1;
		double tsum = 0;
		int flag = 0;//标记是否出现零作为除数的情况
		for(int i = len-1; i >= 0; i--)
		{
			if(s[i]>='0' && s[i]<='9')
			{
				tsum+=(s[i]-'0')*cc;
				cc*=10;
			}
			else if(s[i] == '.')//小数
			{
				tsum = tsum/(cc*1.0);
				cc = 1;
			}
			else if((s[i]=='+'||s[i]=='-') && tsum!=0)
			{
				if(s[i] == '+')
				{
					ss.push(tsum);
					i--;//跳过下一个空格
					continue;
				}
				else
				{
					tsum = -tsum;
					ss.push(tsum);
					i--;//跳过下一个空格
					continue;
				}

			}
			else if(s[i] == ' ')//其中一个运算数已经统计完
			{
				ss.push(tsum);
				tsum = 0;
				cc = 1;
				continue;
			}
			else if(is_op(s[i]))//如果是运算符
			{
				double a = ss.top();
				ss.pop();
				double b = ss.top();
				ss.pop();
				double tt = 0;
				if(s[i] == '+')
					tt = a+b;
				else if(s[i] == '-')
					tt = a-b;
				else if(s[i] == '*')
					tt = a*b;
				else if(s[i] == '/')
				{
					if(b == 0)
					{
						flag = 1;
						break;
					}
					tt = a/b;
				}
				ss.push(tt);
				i--;//跳过下一个空格
			}
		}
		/*int k = 0;//记录最后栈内还剩有的数字有多少个,有多个则ERROR
		int lenn = ss.size();
		double tt;
		for(int i = 0; i < lenn; i++)
		{
			tt = ss.top();
			ss.pop();
			if(!is_op(tt))
			{
				k++;
			}
		}
		if(flag != 1)
			printf("%.1lf\n",tt);*/
		if(flag != 1)
			printf("%.1lf\n",ss.top());
		else
			printf("ERROR\n");
	}
	return 0;
}


3-07. 求前缀表达式的值(25) (ZJU_PAT数学)