逆波蘭表達式


逆波蘭表達式又叫做后綴表達式。在通常的表達式中,二元運算符總是置於與之相關的兩個運算對象之間,這種表示法也稱為中綴表示。波蘭邏輯學家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,-,*,+
1、將一個中序表達式轉化成為逆波蘭表達式

構造兩個棧S1,S2,S1用來存放表達式,S2用來暫時存放運算符,最后完成后,該棧是清空的。

(1)如果遇到的是數字,直接進棧S1

(2)如果遇到的是左括號,進棧S2

(3)如果遇到的是右括號,將S2中的運算符全部出棧壓入S1中,注意括號不壓入

(4)如果遇到的運算符

         1.如果此時棧S2為空,則直接將運算符加入到棧S2中;

         2.如果此時棧S2不為空,當前運算符的優先級大於等於棧頂運算符的優先級,那么直接入棧S2;

         3.如果此時棧S2不為空,當前運算符的優先級小於棧頂運算符的優先級,則將棧頂運算符一直出棧壓入到棧S1中,  直到棧為空或者遇到一個運算符的優先級小於等於當前遍歷的運算符的優先級,然后將該運算符壓入到棧S2中。    

(5)遍歷完整個中序表達式之后,如果棧S2中仍然存在運算符,那么將這些運算符依次出棧壓入到棧S1中,直到棧為空。

2、利用逆波蘭表達式求值

維護一個結果棧S3,該棧最后存放的是表達式的值。從左至右的遍歷棧S1

(1)如果遇到的是數字,直接將數字壓入到S3中

(2)如果遇到的是單目運算符,取S3棧頂的一個元素進行運算之后,將結果壓入到棧S3中

(3)如果遇到的是雙目運算符,取S3棧頂的兩個元素,首先出棧的在左,后出棧的在右進行雙目運算符的計算,將結果壓入到S3中

遍歷完整個棧S1,最后S3中的值就是逆波蘭表達式的值。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM