數據結構與算法——棧實現后綴表達式與中綴表達式轉換


計算:

運用后綴表達式進行計算的具體做法:
建立一個棧S 。從左到右讀表達式,如果讀到 操作數就將它壓入棧S中,如果讀到n元運算符(即需要參數個數為n的運算符)則取出由棧頂向下的n項按操作數運算,再將運算的結果代替原棧頂的n項,壓入棧S中 。如果后綴表達式未讀完,則重復上面過程,最后輸出棧頂的數值則為結束。

轉換:

計算機實現轉換:
將中綴表達式轉換為后綴表達式的算法思想:
·開始掃描;
·數字時,加入后綴表達式;
·運算符:
a. 若為 '(',入棧;
b. 若為 ')',則依次把棧中的的運算符加入后綴表達式中,直到出現'(',從棧中刪除'(' ;
c. 若為 除括號外的其他 運算符, 當其優先級高於除'('以外的棧頂運算符時,直接入棧。否則從棧頂開始,依次彈出比當前處理的 運算符優先級高和優先級相等的運算符,直到一個比它優先級低的或者遇到了一個左括號為止。
·當掃描的中綴表達式結束時,棧中的的所有運算符 出棧
人工實現轉換
這里我給出一個中綴表達式:a+b*c-(d+e)
第一步:按照運算符的優先級對所有的運算單位加括號:式子變成了:((a+(b*c))-(d+e))
第二步:轉換前綴與后綴表達式
前綴:把運算符號移動到對應的括號前面
則變成了:-( +(a *(bc)) +(de))
把括號去掉:-+a*bc+de 前綴式子出現
后綴:把運算符號移動到對應的括號后面
則變成了:((a(bc)* )+ (de)+ )-
把括號去掉:abc*+de+- 后綴式子出現
發現沒有,前綴式, 后綴式是不需要用括號來進行優先級的確定的。如表達式:3+(2-5)*6/3
后綴表達式 棧
3_________________+
3 ________________+(
3 2 _______________+(-
3 2 5 -_____________ +
3 2 5 - _____________+*
3 2 5 - 6 * ___________+/
3 2 5 - 6 *3 __________+/
3 2 5 - 6 *3 /+________
("_____"用於隔開后綴表達式與棧)
另外一個人認為正確的轉換方法:
遍歷中綴表達式的每個節點,如果:
1、 該節點為 操作數
直接拷貝進入后綴表達式
2、 該節點是運算符,分以下幾種情況:
A、 為“(” 運算符
壓入臨時堆棧中
B、 為“)”運算符:
不斷地彈出臨時堆棧頂部運算符直到頂部的運算符是“(”為止,從棧中刪除'('。並把彈出的運算符都添加到后綴表達式中。
C、 為其他運算符,有以下步驟進行:
比較該運算符與臨時棧棧頂指針的運算符的優先級,如果臨時棧棧頂指針的優先級大於等於該運算符的優先級,彈出並添加到后綴表達式中,反復執行前面的比較工作,直到遇到一個棧頂指針的優先級低於該運算符的優先級,停止彈出添加並把該運算符壓入棧中。
此時的比較過程如果出現棧頂的 指針為‘(’,則停止循環並把該運算符壓入棧中,注意:‘(’不要彈出來。
遍歷完中綴表達式之后,檢查臨時棧,如果還有 運算符,則全部彈出,並添加到后綴表達式中。
 
Java代碼:
 1     /**    
 2     * 后序遍歷遞歸實現    
 3     *    
 4     * 左 右 中    
 5     * @param node    
 6     */    
 7 public void nextOrder(Node node) {    
 8     if (node == null) {    
 9         return;    
10     }    
11     nextOrder(node.left);    
12     nextOrder(node.right);    
13     System.out.println(node.data);    
14 }    
15  
16     /**    
17     * 后序遍歷非遞歸實現    
18     * @param node    
19     */    
20 public void nextOrder2(Node node) {    
21     if (node == null) {    
22         return;    
23     }    
24     Stack<Node> stack = new Stack<>();    
25     Node p = node;    
26     while (node != null) {    
27         while (node.left != null) {    
28         stack.push(node);    
29         node = node.left;    
30         }    
31         while (node != null && (node.right == null || node.right == p)) {    
32             System.out.println(node.data);    
33             p = node;    
34             if (stack.isEmpty()) {    
35                 return;    
36             }    
37             node = stack.pop();    
38         }    
39         stack.push(node);    
40         node = node.right;    
41     }    
42 }    

 


免責聲明!

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



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