1. 程式人生 > >字尾表示式(逆波蘭表示式)

字尾表示式(逆波蘭表示式)

逆波蘭表示式又叫做字尾表示式。在通常的表示式中,二元運算子總是置於與之相關的兩個運算物件之間,這種表示法也稱為中綴表示。波蘭邏輯學J.Lukasiewicz於1929年提出了另一種表示表示式的方法,按此方法,每一運算子都置於其運算物件之後,故稱為字尾表示。
表示式
逆波蘭表示式,它的語法規定,表示式必須以逆波蘭表示式的方式給出。逆波蘭表示式又叫做字尾表示式。這個知識點在資料結構和編譯原理這兩門課程中都有介紹,下面是一些例子:
正常的表示式 逆波蘭表示式
a+b —> a,b,+
a+(b-c) —> a,b,c,-,+
a+(b-c)d —> a,b,c,-,d,

,+
a+d*(b-c)—>a,d,b,c,-,*,+
a=1+3 —> a=1,3 +
http=(smtp+http+telnet)/1024 寫成什麼呢?
http=smtp,http,+,telnet,+,1024,/
用途
逆波蘭表示式是一種十分有用的表示式,它將複雜表示式轉換為可以依靠簡單的操作得到計算結果的表示式。例如(a+b)(c+d)轉換為ab+cd+
優勢
它的優勢在於只用兩種簡單操作,入棧和出棧就可以搞定任何普通表示式的運算。其運算方式如下:
如果當前字元為變數或者為數字,則壓棧,如果是運算子,則將棧頂兩個元素彈出作相應運算,結果再入棧,最後當表示式掃描完後,棧裡的就是結果。
將一個普通的中序表示式轉換為逆波蘭表示式的一般演算法是:
(1)首先構造一個運算子棧,此運算子在棧內遵循越往棧頂優先順序越高的原則。
(2)讀入一個用中綴表示的簡單算術表示式,為方便起見,設該簡單算術表示式的右端多加上了優先順序最低的特殊符號“#”。
(3)從左至右掃描該算術表示式,從第一個字元開始判斷,如果該字元是數字,則分析到該數字串的結束並將該數字串直接輸出。
(4)如果不是數字,該字元則是運算子,此時需比較優先關係。
做法如下:將該字元與運算子棧頂的運算子的優先關係相比較。如果,該字元優先關係高於此運算子棧頂的運算子,則將該運算子入棧。倘若不是的話,則將棧頂的運算子從棧中彈出,直到棧頂運算子的優先順序低於當前運算子,將該字元入棧。
(5)重複上述操作(3)-(4)直至掃描完整個簡單算術表示式,確定所有字元都得到正確處理,我們便可以將中綴式表示的簡單算術表示式轉化為逆波蘭表示的簡單算術表示式。
演算法流程
下面是程式化演算法流程:
1、建立運算子棧stackOperator用於運算子的儲存,壓入’\0’。
2、預處理表達式,正、負號前加0(如果一個加號(減號)出現在最前面或左括號後面,則該加號(減號)為正負號) 。
3、順序掃描表示式,如果當前字元是數字(優先順序為0的符號),則直接輸出該數字;如果當前字元為運算子或括號(優先順序不為0的符號),則判斷第4點 。
4、若當前運算子為’(‘,直接入棧;
若為’)’,出棧並順序輸出運算子直到遇到第一個’(‘,遇到的第一個’(‘出棧但不輸出;
若為四則運算子,比較棧頂元素與當前元素的優先順序:
如果 棧頂元素運算子優先順序 >= 當前元素的優先順序,出棧並順序輸出運算子直到 棧頂元素優先順序 < 當前元素優先順序,然後當前元素入棧;
如果 棧頂元素 < 當前元素,直接入棧。
5、重複第3點直到表示式掃描完畢。
6、順序出棧並輸出運算子直到棧頂元素為’\0’。