逆波蘭表示式,它的語法規定,表示式必須以逆波蘭表示式的方式給出。逆波蘭表示式又叫做字尾表示式。
這個知識點在資料結構和編譯原理這兩門課程中都有介紹,下面是一些例子:
正常的表示式 逆波蘭表示式
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 +
解釋我們拿a+(b-c)*d ---> a,b,c,-,d,*,+為例子
首先是變數要按順序並不參於入棧,+號入棧,ab,【入棧,-入棧(符號入棧後要看棧頂符號優先順序,如果
比自己高或者等於自己就先讓它們出站自己在入棧(的優先順序很低 】,然後變數序列abc,)入棧【(優先順序
很高他會匹配(把之間的符號壓出】,序列程式設計abc-,然後*入棧*比+高所以不用出,序列變成abc-d,表示式
結束全部出棧,則有abc-d*+。
中綴變字尾:
將乙個普通的中序表示式轉換為逆波蘭表示式的一般演算法是:
(1)首先構造乙個運算子棧,此運算子在棧內遵循越往棧頂優先順序越高的原則。
(2)讀入乙個用中綴表示的簡單算術表示式,為方便起見,設該簡單算術表示式的右端多加上了優先順序最低的特殊符號「#」。
(3)從左至右掃瞄該算術表示式,從第乙個字元開始判斷,如果該字元是數字,則分析到該數字串的結束並將該數字串直接輸出。
(4)如果不是數字,該字元則是運算子,此時需比較優先關係。
做法如下:將該字元與運算子棧頂的運算子的優先關係相比較。如果,該字元優先關係高於此運算子棧頂的運算子,則將該運
符入棧。倘若不是的話,則將棧頂的運算子從棧中彈出,直到棧頂運算子的優先順序低於當前運算子,將該字元入棧。
(5)重複上述操作(3)-(4)直至掃瞄完整個簡單算術表示式,確定所有字元都得到正確處理,我們便可以將中綴式表示的
簡單算術表示式轉化為逆波蘭表示的簡單算術表示式。
逆波蘭(字尾)表示式求值演算法:
(1)從左到右依次掃瞄語法單元的專案。
(2)如果掃瞄的專案是運算元,則將其壓入運算元堆疊,並掃瞄下乙個專案。
(3)如果掃瞄的專案是乙個二元運算子,則對棧的頂上兩個運算元執行該運算。
(4)如果掃瞄的專案是乙個一元運算子,則對棧的最頂上運算元執行該運算。
(5)將運算結果重新壓入堆疊。
(6)重複步驟2-5,堆疊中即為結果值。
用途逆波蘭表示式是一種十分有用的表示式,它將複雜表示式轉換為可以依靠簡單的操作得到計算結果的表達
式。例如(a+b)*(c+d)轉換為ab+cd+*
優點:它的優勢在於只用兩種簡單操作,入棧和出棧就可以搞定任何普通表示式的運算。其運算方式如下:
如果當前字元為變數或者為數字,則壓棧,如果是運算子,則將棧頂兩個元素彈出作相應運算,結果再入
棧,最後當表示式掃瞄完後,棧裡的就是結果。
棧的應用 逆波蘭表示式
逆波蘭表示式又稱為 字尾表示式 例 4.99 1.06 5.99 6.99 1.06 的字尾表示式為 4.99 1.06 5.99 6.99 1.06 正常寫的表示式又稱為中綴表示式,如何將乙個中綴表示式表示式轉換成字尾表示式?這裡就要用到棧。但見到乙個數時就把他推入棧中,在遇到乙個運算子時就將該運...
波蘭表示式和逆波蘭表示式(棧)
中綴表示式如1 2 2 1 其運算子一般出現在運算元之間,因此稱為中綴表示式,也就是大家程式設計中寫的表達 式。編譯系統不考慮表示式的優先級別,只是對表示式從左到右進行掃瞄,當遇到運算子時,就把其前面的兩 個運算元取出,進行操作。為達到上述目的,就要將中綴表示式進行改寫,變為字尾表示式 如上面的表示...
棧的應用 逆波蘭表示式求值
逆波蘭表示式也叫字尾表示式,先運算元,後操作符。棧 後進先出 順序遍歷波蘭表示式,遇到運算元的時候入棧 遇到操作符,先讓運算元出棧運算運算元,然後再把運算結果入棧,所有的算式都可以用逆波蘭表示式寫出來。把算式12 3 4 6 8 2 2用逆波蘭表示式寫出來,就是 12 3 4 6 8 2 2 逆波蘭...