1. 程式人生 > >數據結構與算法——棧實現後綴表達式與中綴表達式轉換

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

print 重復 .com 數據 nbsp 依次 中綴 遞歸實現 urn

計算:

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

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