【遞迴】 之 逆波蘭表示式
阿新 • • 發佈:2019-02-10
問題描述
逆波蘭表示式是一種把運算子前置的算術表示式,例如普通的表示式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()函式,自己處理浮點數的讀入,邏輯複雜後出錯。