逆波蘭表達式(基本算法之遞歸)
總時間限制: 1000ms 記憶體限制: 65536kB
描述
逆波蘭表達式是一種把運算符前置的算術表達式,例如普通的表達式2 + 3的逆波蘭表示法為+ 2 3。逆波蘭表達式的優點是運算符之間不必有優先級關系,也不必用括号改變運算次序,例如(2 + 3) * 4的逆波蘭表示法為* + 2 3 4。本題求解逆波蘭表達式的值,其中運算符包括+ - * /四個。
輸入
輸入為一行,其中運算符和運算數之間都用空格分隔,運算數是浮點數。
輸出
輸出為一行,表達式的值。
可直接用printf(“%f\n”, v)輸出表達式的值v。
樣例輸入
* + 11.0 12.0 + 24.0 35.0
樣例輸出
1357.000000
提示
可使用atof(str)把字元串轉換為一個double類型的浮點數。atof定義在math.h中。
此題可使用函數遞歸調用的方法求解。
關鍵是要能想到不是一次性把一行擷取進去,而是一次擷取一個操作數或操作符,然後按照逆波蘭的規則來計算,遞歸起來就很簡單了。
#include <iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
//http://noi.openjudge.cn/ch0202/1696/
char a[];
double f(){
cin>>a;
switch(a[]){
case '+':return f()+f();
case '-':return f()-f();
case '*':return f()*f();
case '/':return f()/f();
default:return atof(a);
}
}
int main(int argc, char *argv[]) {
double ans=;
ans=f();
printf("%f\n",ans);
return ;
}