運算式表達式(中序、前序、後序)
運算式表達式(中序、前序、後序)
運算式(Expression)有三種表示方式:中序式(Infix)、前序式(Prefix)、後序式(Postfix)。
一般我們算數學時看到的表達式 A * (B + C) / D,我們知道括號優先算,再來先乘除後加減,這樣的表達式叫(中序Infix)。對於電腦或編譯器來說,解析過於複雜的中序是有難度的,所以有了前序及後序。
中序如何轉換成前序或後序?記住兩個要點
- 前序就是將運算元移動貼到==左括號==。例如
(A+B)=>(+AB) - 後序就是將運算元移動貼到==右括號==。例如
(A+B)=>(AB+)
題目一:將 A + B * (C + D) + E / F 轉為前序及後序。
- 先把運算式所有隱藏的括號加上去,會得出
((A + ( B * ( C + D ))) + ( E / F )) - 一個個括號接續處理,假如要轉換成前序,就是把願算元放到括號左邊
先從最內層的括號開始,(==C== + ==D==) => (+ ==C== ==D==) ; (==E== / ==F==) => (/ ==E== ==F==)
目前可以得出((A + ( B * ( + C D ))) + ( / E F )) - 內層括號解完,開始慢慢往外解,( ==B== ( ==+ C D== )),乘號往前放,會得出
( ==B== ( ==+ C D== )),在這我會先把內層括號先去掉,看起來比較不會那麼亂 => (* ==B== ==+CD==) - 再往外解一層(==A== + (==B+CD==)) => (+ ==A== (==B+CD==)) => (+ ==A== ==*B+CD==)
- 接下來只剩下最後一個運算元了
- (==+AB+CD== + ==/EF== ),一樣+號往左邊放再去括號 => (+ ==+AB+CD== ==/EF== ) => +==+AB+CD== ==/EF==,這個中序轉前序結果即`++AB+CD/EF`
中序轉後序一樣概念,只是運算元放的位置變成貼近右括號。
題目二:將 + + * A B / - C D – E F G 轉為中序及後序
要點:一個運算子(符號)會搭配兩個運算元(符號左右兩個)
- 根據要點,把隱形括號給找出來,可以先把比較好找的括起來,看到一個符號搭配兩個運算元的那種先畫起來 => + + (* A B) / (- C D) (– E F) G
- 進階畫括號,已經被刮起來的,就把它視為一個運算元,可以得出
=> + + ( A B) ==(== / (- C D) (– E F) ==)== G
=> + ==(== + ( A B) ( / (- C D) (– E F) ) ==)== G
=> ==(== + ( + (* A B) ( / (- C D) (– E F) ) ) G ==)== - 符號放回去兩個運算元中間,例如(+ ==()== ==()==) => (==()== + ==()==),可以得出
=> ( ( ( A B ) + (( C - D ) / ( E - F ) ) ) + G )
=> 去掉不必要的括號,得出 A B + ( C - D ) / ( E - F ) + G
現在有了中序了,根據第一題的概念去轉後序。
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Joeの小屋!
評論
ValineDisqus



