| | 逆波蘭表達式 rpn(reverse polish notation)
逆波蘭表達式,它的語法規定,表達式必須以逆波蘭表達式的方式給出。逆波蘭表達式又叫做後綴表達式。這個知識點在數據結構和編譯原理這兩門課程中都有介紹,下面是一些例子:
正常的表達式 逆波蘭表達式
a+b a,b,+
a+(b-c) a,b,c,-,+
a+(b-c)*d a,d,b,c,-,*,+
a=1+3 a=1,3 +
http=(smtp+http+telnet)/1024 寫成什麽呢?
http=smtp,http,telnet,+,+,1024,/ | | 逆波蘭表達式 rpn(Reverse Polish Notation)
逆波蘭表達式,它的語法規定,表達式必須以逆波蘭表達式的方式給出。逆波蘭表達式又叫做後綴表達式。這個知識點在數據結構和編譯原理這兩門課程中都有介紹,下面是一些例子:
正常的表達式 逆波蘭表達式
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用於運算符的存儲,壓入' |
|
|