波蘭式與逆波蘭式

一、波蘭式(前綴表達式)

波蘭式是在通常的表達式中,二元運算符總是置於與之相關的兩個運算對象之前,所以,這種表示法也稱爲前綴表達式。例如:3*(2-(5+1)),用波蘭式來表示是:* 3 - 2 + 5 1。

閱讀這個表達式需要從左至右讀入表達式,如果一個操作符後面跟着兩個操作數時,則計算,然後將結果作爲操作數替換這個操作符和兩個操作數,重複此步驟,直至所有操作符處理完畢。從左往右依次讀取,直到遇到+ 5 1,做計算後,將表達式替換爲* 3 - 2 6,然後再次從左往右讀取,直到遇到- 2 6,做計算後,將表達式替換爲*3 (-4)(這裏“-”爲負號不是減號,-4爲一個數負四),從而得到最終結果-12。

二、逆波蘭式(後綴表達式)

逆波蘭式(Reverse Polish notation,RPN,或逆波蘭記法),也叫後綴表達式(將運算符寫在操作數之後)。例如:3*(2-(5+1)),用逆波蘭式來表示是:3 2 5 1 + - *,也就是把操作運算符往操作數後面放。

閱讀這個表達式需要從左往右讀入表達式,當讀到第一個操作符時,從左邊取出兩個操作數做計算,然後將這個結果作爲操作數替換這個操作符和兩個操作數,重複此步驟,直至所有操作符處理完畢。
3 2 5 1 + - *
→3 2 6 - *
→3 (-4) *
→ -12

三、中綴表達式與波蘭式、逆波蘭式的轉換

既然中綴表達式對於計算機的運算並不便利,而前綴後綴表達式的計算相對簡單方便。因此,找到一種途徑將中綴表達式轉換成前綴後綴表達式就十分重要。實際上,二者的轉換算法看起來也很像一個逆過程。
相信看完前面寫的,大家應該發現了,前綴表達式就是操縱符基本上都分佈在操作數的前面,而後綴表達式的操作符又基本上都分佈在操作數的後面,那我介紹一種終極簡單易懂的轉換規律。
同樣我們以3*(2-(5+1))舉例,當我們在計算中綴表達式的時候,我們只需要把所有優先級用括號標註起來,然後再根據波蘭式和逆波蘭式,前者把操作符提前,後者提後,再把括號去掉:
3*(2-(5+1))
波蘭式 逆波蘭式
→(3*(2-(5+1))) → (3*(2-(5+1)))
(3-(2+(5 1))) → (3(2(5 1)+)-)
→* 3 - 2 + 5 1 → 3 2 5 1 + - *

四、總結

爲什麼要將看似簡單的中序表達式轉換爲複雜的波蘭式或者逆波蘭式?原因就在於這個簡單是相對人類的思維結構來說的,對計算機而言中序表達式是非常複雜的結構。相對的,逆波蘭式在計算機看來卻是比較簡單易懂的結構。就比如你用用中文說“你是誰”,英語是“Who are you”,直接翻譯過來就是”誰是你“,這就是不同的語法規則造成的。所以我們在與計算機交流的時候要用計算機語言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章