题目:http://pta.patest.cn/pta/test/15/exam/4/question/836
PTA - 数据结构与算法(中文) - 5-21
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。
输入格式说明:
输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式说明:
输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”。
样例输入与输出:
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
double exp() //!返回前缀表达式的值
{
char a[10]; //!用于存储第一个非空格字符
cin >> a;
if(!a[1])
{ //!a[1]为空,只有一位,即运算符或者数字0-9
switch(a[0])
{
//!递归
case '+': return exp() + exp();
case '-': return exp() - exp();
case '*': return exp() * exp();
case '/':
{
double fenzi=exp();
double fenmu=exp();
if(fenmu!=0)
return fenzi / fenmu;
else{
cout << "ERROR";
exit(0); //!程序结束
}
}
default : return atof(a); //!将字符串转化成浮点数
}
}
else
{ //!a[1]不为空,不是运算符,是操作数
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()
{
printf("%.1f",exp()); //!保留一位小数
return 0;
}
