題目: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;
}

