計算:
運用后綴表達式進行計算的具體做法:
建立一個棧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 }