問題描述:
逆波蘭表達式是一種吧運算符前置的算術表達式,例如普通的表達式2+3的逆波蘭表示為+23.逆波蘭表達式的優點是運算符之間不必有優先級的關系,也不必有括號改變運算次序,例如(2+3)*4的逆波蘭表示法為*+2 3 4.本題求解的逆波蘭表達式的值。
輸入數據:
輸入為一行,其中運算符和運算數之間都用空格分隔,運算數是浮點數。
輸出要求:
輸出為一行,即表達式的值。
輸入樣例:
* + 11.0 12.0 +24.0 35.0+
輸出樣例:
1357.000000
解題思路:
這個問題看上去有些復雜,如果只是簡單地模擬計算步驟不太容易想清楚,但是如果用遞歸的思想就非常容易想清楚。這里根據逆波蘭表達式的定義進行遞歸求解。在遞歸函數中,針對當前的輸入有5種情況:1。輸入是常數,則表達式的值就是這個常數;2.輸入的是‘+’,則表達式的值是再繼續讀入兩個表達式並計算出他們的值,然后將他們的值進行相加;3.輸入‘-’;4.輸入是‘*’;5.輸入是‘/’;后三種情況與2.相同,只是計算從‘+’變成‘-’,‘*’,‘/’。
1 參考程序: 2 #include<stdio.h> 3 #include<math.h> 4 double exp(){ 5 char a[10]; 6 scanf("%s",a); 7 switch(a[0]){ 8 case'+':return exp()+exp(); 9 case'-':return exp()-exp(); 10 case'*':return exp()*exp(); 11 case'/':return exp()/exp(); 12 default:return atof(a); 13 } 14 } 15 void main() 16 { 17 double ans; 18 ans=exp(); 19 printf("%f\n",ans); 20 }