利用棧進行操作
1.將算式根據運算優先順序次序完全括起來;左右括號的運算優先順序比運算子低。
2.從左到右依次掃瞄算數表示式,令讀入的符號為δ,若δ是操作式,則將δ輸出到前序式字串中,若δ是運算子,則分為以下三種情況要討論:
(1).δ=左括號,δ入棧;
(2).δ=右括號,彈出棧頂運算子,若不是左括號,則將取出的運算子輸出到前序串中,並重複此步直到取出左括號為止,然後將δ與最後的左括號丟棄,返回2;
(3).δ=運算子(+-×÷ⁿ):
①設棧頂的運算子為⊕,若δ的優先順序大於⊕,則將δ入棧;
②若δ的優先順序小於或等於⊕,則彈出棧頂運算子⊕並輸出到前序串中,返回(1);
③最後,若棧不空,則將棧頂運算子彈出到前序字串中,直到棧空為止。
舉例:a+b-a*((c+d)/e-f)+g
1..將算式根據運算優先順序次序完全括起來:((a+b)-(a*(((c+d)/e)-f)))+g
2..( ( 入棧,a輸出到前序式字串中 —–字串:a ;棧中:((
3..+優先順序高於(,+入棧,b輸出到前序式字串中 —–字串:ab ;棧中:((+
4..掃瞄到),且優先順序小於棧頂元素+,+出棧,捨棄左右括弧 —–字串:ab+ ;棧中:(
5..掃瞄到-,入棧,掃瞄到(,入棧 ,掃瞄到a,輸出到字串中—–字串:ab+a;棧中:(-(
6..掃瞄到*,入棧,三個左括弧,入棧,掃瞄到c,輸出到字串中—–字串:ab+ac ;棧中:(-( *(((
7..掃瞄到+,入棧,掃瞄到d,輸出到字串中 —–字串:ab+acd ;棧中:(-( *(((+
8..掃瞄到),彈出+,捨棄左右括弧,掃瞄到/,入棧,掃瞄到e,輸出到字串中—–字串:ab+acd+e;棧中:(-( *((/
9..掃瞄到),彈出/,捨棄左右括弧,掃瞄到-,入棧—–字串:ab+acd+e/;棧中:(-( *(-
10..掃瞄到f,輸出到字串中,掃瞄到三個右括弧,運算子依次匹配出棧輸出到字串中,捨棄左右括弧—–字串:ab+acd+e/f-*-;棧中(空):
11..掃瞄到+,入棧,掃瞄到g,輸出到字串中,最後彈出+,完畢—–字串:ab+acd+e/f-*-g+;棧中(空):
注:分析部分引用《資料結構(第2版)》**江主編,清華大學出版社
後序式的運算
後序式的運算 說明 將中序式轉換為後序式的好處是,不用處理運運算元先後順序問題,只要依序由表示式由前往後讀取即可。解法 運算時由後序式的前方開始讀取,遇到運算元先存入堆疊,如果遇到運運算元,則由堆疊中取出兩個運算元進行對應的運算,然後將 結果存回堆疊,如果表示式讀取完畢,那麼堆疊頂的值就是答案了,例...
樹的先序 中序 推後序, 後序 中序 推先序
根據中序遍歷 先序遍歷構建 輸出後序遍歷 後序遍歷為左右根 遞迴的返回條件中序遍歷中 左子樹和右子樹 過i將中序遍歷中的樹分為左子樹和右子樹 i為中序遍歷的根節點 需要輸出的結點 每棵樹都是自己 的根結點 2.確定左子樹的start,與 end範圍,同時通過先序陣列找到此時的根節點 上乙個根結點 1...
樹的前序中序後序
已知前序 中序求。後序 前序 abcdefgh 中序 bdceafhg 首先由 前序 根 左子樹 右子樹 中序 左子樹 根 右子樹 知道了a是根節點1。bcde是在左子樹,fgh是在右子樹。由遞迴的思想,bcde看做新的樹。即有 前序 bcde 中序 bdce 知道了b是根節點2,cde是右子樹,無...