資料結構--中綴表示式轉為字尾表示式(逆波蘭表示式)
中綴表示式是一個通用的算術或邏輯公式表示方法。操作符是以中綴形式處於運算元中間。例如:3*4+3-1;
字尾表示式不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右(不再考慮運算子的優先規則)例如:(2+1)*3,即2 1 + 3 *
(以上來自百度百科)
1.中綴表示式轉為字尾表示式
想要完成此過程需要一個數組arr存放中綴表示式,一個ret 存放字尾表示式,還要藉助一個輔助棧stack1存放操作符,stack2存放運算結果。
規則:
從左到右一次遍歷中綴表示式,如果是數字就直接存放到字尾表示式中;
如果是操作符,例如操作符A,需要將A於操作符棧stack1的棧頂操作符比較,如果stack1為空或棧頂操作符優先順序低於A,將A壓入stack1.
如果A的優先順序低於或等於stack1棧頂的操作符的優先順序,把棧頂操作符pop出棧,存到ret 中,然後繼續與A比較,重複此前動作直到A入棧。
注意:
操作符'('和')' 比較特殊。如果是'(' 直接入棧stack1;如果是‘)' 需要將stack1的操作符pop到ret中,直到彈出'(';
重複以上工作,直到把操作符棧stack1中的操作符全部彈出到ret中;這樣就把中綴表達轉化為字尾表示式;
例如:
中綴表示式:3*1+(4+6)/2-1
第一步:取3,ret[ 3 ] , stack1[ ];
第二步:取*, ret[3] , stack1 [ * ];
第三步: 取1 ,ret[3,1] , stack1 [ * ];
第四步,取+,ret[3,1,*] , stack1 [ + ];
第五步:取(, ret[3,1,*] , stack1 [ + ,( ];
第六步:取4, ret[3,1,*,4] , stack1 [ + ,( ];
第七步:取+, ret[3,1,*,4] , stack1 [ + ,( ,+ ];
第八步:取6,ret[3,1,*,4, 6] , stack1 [ + ,( ,+ ];
第九步:取), ret[3,1,*,4, 6,+] , stack1 [ + ];
第十步:取/, ret[3,1,*,4, 6,+] , stack1 [ + ,/ ];
第十一步:取2,ret[3,1,*,4, 6,+,2] , stack1 [ + ,/ ];
第十二步:取-, ret[3,1,*,4,6,+,2,/, + ] , stack1 [ - ];
第十三步:取1,ret[3,1,*,4,6,+,2,/,+,1 ] , stack1 [ - ];
處理stack1: ret[3,1,*,4, 6,+,2,/, +,1 ,- ] , stack1 [ ];
所以後綴表示式為:3,1,*,4, 6,+,2,/, +,1 ,- ;
2.利用字尾表示式計算結果
規則:遍歷儲存字尾表示式的列表,將元素依次進棧,當遇到操作符時,連續出棧兩個元素,進行運算,再將結果進棧,最後棧內留下的元素就是計算結果