本題考點:
- 前綴表達式遞歸求值
算術表達式有前綴表示法、中綴表示法和后綴表示法等形式。前綴表達式指二元運算符位於兩個運算數之前,例如2+3*(7-4)+8/4的前綴表達式是:+ + 2 * 3 - 7 4 / 8 4。請設計程序計算前綴表達式的結果值。
我們先來了解一下前綴表達式:
前綴表達式也稱逆波蘭表達式,一個逆波蘭表達式的組成如下:
表達式 = 符號(+,-,*,/) + 數字1(或子表達式) + 數字2(或子表達式)
每個子表達式只需要兩個參數的輸入,所以參數的讀入可以在運算時進行,以避免不知道讀入數據的個數。
由於表達形式上逆波蘭表達式就具有遞歸的特征,所以我們可以采用遞歸的方式來進行逆波蘭表達式的處理。
完整代碼如下:
/*
Author: Veeupup
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int INF = INT32_MAX;
double exp()
{
char a[10];
scanf("%s", a);
if (strlen(a) == 1 && !(a[0] >= '0' && a[0] <= '9'))
{ // 長度為 1 才是符號,不然有可能是負數
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
{
printf("ERROR");
exit(0);
}
}
}
else
{
return atof(a);
}
}
int main()
{
double ans;
ans = exp();
printf("%.1f", ans);
return 0;
}