前中字尾表示式

sayWhat_sayHello發表於2018-09-06

X綴表示式

  • 中綴表示式:(a+b)
  • 字首表示式:+ab
  • 字尾表示式:ab+

與字首或字尾記法不同的是,中綴記法中括號是必需的。\
計算過程中必須用括號將操作符和對應的運算元括起來,用於指示運算的次序。

中綴表示式

中綴表示式和我們一般的邏輯一樣,不過是括號不能省。

字首表示式

具體做法

人工實現轉換

中綴表示式:a+b*c-(d+e)第一步:按照運算子的優先順序對所有的運算單位加括號:式子變成了:((a+(b*c))-(d+e))\
字首表示式:把運算子號移動到對應的括號前面則變成了:-( +(a *(bc)) +(de))
把括號去掉:-+a*bc+de 字首式子出現

字尾表示式

具體做法:

人工實現轉換

中綴表示式:a+b*c-(d+e)
第一步:按照運算子的優先順序對所有的運算單位加括號:式子變成了:
((a+(b*c))-(d+e))
字尾表示式:把運算子號移動到對應的括號後面則變成了:
((a(bc)* )+ (de)+ )-
把括號去掉:abc*+de+-字尾式子出現

程式邏輯

從表示式頭開始掃描\
數字時,加入字尾表示式;\
運算子:\
a. 若為 ‘(‘,入棧;\
b. 若為 ‘)’,則依次把棧中的的運算子加入字尾表示式中,直到出現’(‘,從棧中刪除’(’ ;\
c. 若為 除括號外的其他運算子, 當其優先順序高於除’(‘以外的棧頂運算子時,直接入棧。\
否則從棧頂開始,依次彈出比當前處理的運算子優先順序高和優先順序相等的運算子,直到一個比它優先順序低的或者遇到了一個左括號為止,然後將其自身壓入棧中(先出後入)。
·當掃描的中綴表示式結束時,棧中的的所有運算子出棧;

具體案例:

表示式:3+(2-5)*6/3

步驟 字尾表示式
1 3 +
2 3 +(
3 3 2 +(-
4 3 2 5 - +
5 3 2 5 - +*
6 3 2 5 - 6 * +/
7 3 2 5 - 6 *3 +/
8 3 2 5 - 6 *3 /+

實現程式碼:

  /**    
    * 後序遍歷遞迴實現    
    *    
    * 左 右 中    
    * @param node    
    */    
public void nextOrder(Node node) {    
    if (node == null) {    
        return;    
    }    
    nextOrder(node.left);    
    nextOrder(node.right);    
    System.out.println(node.data);    
}    

    /**    
    * 後序遍歷非遞迴實現    
    * @param node    
    */    
public void nextOrder2(Node node) {    
    if (node == null) {    
        return;    
    }    
    Stack<Node> stack = new Stack<>();    
    Node p = node;    
    while (node != null) {    
        while (node.left != null) {    
        stack.push(node);    
        node = node.left;    
        }    
        while (node != null && (node.right == null || node.right == p)) {    
            System.out.println(node.data);    
            p = node;    
            if (stack.isEmpty()) {    
                return;    
            }    
            node = stack.pop();    
        }    
        stack.push(node);    
        node = node.right;    
    }    
}    

參考

主要參考百度百科,同時做了一些排版的處理

相關文章