1. 程式人生 > >【遞迴】 之 逆波蘭表示式

【遞迴】 之 逆波蘭表示式

問題描述

逆波蘭表示式是一種把運算子前置的算術表示式,例如普通的表示式2 + 3的逆波蘭表示法為+ 2 3。逆波蘭表示式的優點是運算子之間不必有優先順序關係,也不必用括號改變運算次序,例如(2 + 3) * 4的逆波蘭表示法為* + 2 3 4。本題求解逆波蘭表示式的值,其中運算子包括 +  -  *  /  四個。
輸入資料
輸入為一行,其中運算子和運算數之間都用空格分隔,運算數是浮點數
輸出要求
輸出為一行,表示式的值。 
輸入樣例
* + 11.0 12.0 + 24.0 35.0
輸出樣例
1357.000000
解題思路

這個問題看上去有些複雜,如果只是簡單地模擬計算步驟不太容易想清楚,但是如果用遞迴的思想就非常容易想清楚。讓我們根據逆波蘭表示式的定義進行遞迴求解。在遞迴函式中,針對當前的輸入,有五種情況:1)輸入是常數,則表示式的值就是這個常數;2)輸入是’+’,則表示式的值是再繼續讀入兩個表示式並計算出它們的值,然後將它們的值相加;3)輸入是’-’;4)輸入是’*’; 5)輸入是’/’;後幾種情況與2)相同,只是計算從’+’變成’-’,’*’,’/’。  

參考程式

#include <stdio.h>
#include<math.h>
double exp(){
    char a[10];
    scanf("%s", a);
    switch(a[0]){
        case'+': return exp( ) + exp( );
        case'-': return exp( ) - exp( );
        case'*': return exp( ) * exp( );
        case'/': return exp( ) / exp( );
        default: return atof(a);
    }
}
void main()
{
    double ans;
    ans = exp();
    printf("%f", ans);
}


實現中常見的問題

問題一:不適應遞迴的思路,直接分析輸入的字串,試圖自己寫進棧出棧的程式,寫得邏輯複雜後,因考慮不周出錯;
問題二:不會是用atof()函式,自己處理浮點數的讀入,邏輯複雜後出錯。