初考-統計資料處理大意109 年第 18 題單選題
將前序表示式 -*ab-c*ab 轉換成中序表示式,何者正確?(a, b, c 為變數)
Aa-b*c-a*b
B(a-b)*c-a*b
Ca*b-c-a*b
Da*b-(c-a*b)正確答案
D正確答案
前序轉中序可由右至左掃描,遇到運算子就取出兩個運算元結合並加上括號,最後依運算子優先權化簡括號即可得解。
為什麼答案是 D
完整保留了語法樹的結構。左子樹為 a*b,右子樹為 c-a*b。因為右子樹整體作為被減數,必須加上括號 (c-a*b) 以維持正確的運算優先級。
載入中…
完整詳解
Pro · 無限重點 前序轉中序可由右至左掃描,遇到運算子就取出兩個運算元結合並加上括號,最後依運算子優先權化簡括號即可得解。
由右至左掃描:先將最右邊的 *ab 轉為 (a*b);接著 -c(a*b) 轉為 (c-(a*b));再將左邊的 *ab 轉為 (a*b);最後結合最前面的減號成為 (a*b)-(c-(a*b)),化簡即為 D。
逐選項分析
A✕
未考慮運算子優先權與結合順序,缺少必要的括號會導致依照中序規則先計算 b*c,完全破壞了原前序表示式的語法樹結構。
B✕
括號位置錯誤,將前面的 a-b 優先計算。原前序式最左邊的運算子是減號,代表最後一步才是執行左右兩大子樹的相減。
C✕ 陷阱
缺少右半部的括號。在中序表示法中,a*b-c-a*b 會被由左至右結合視為 (a*b-c)-a*b,改變了原式中 c-(a*b) 作為減數的運算順序。
D✓ 正確
完整保留了語法樹的結構。左子樹為 a*b,右子樹為 c-a*b。因為右子樹整體作為被減數,必須加上括號 (c-a*b) 以維持正確的運算優先級。
運算式表示法比較
| 表示法 | 運算子位置 | 解析方向 (電腦) | 是否需括號 |
|---|
| 前序 (Prefix) | 運算元前面 | 由右至左 (Stack) | 否 |
| 中序 (Infix) | 運算元中間 | 需考慮優先權與括號 | 是 |
| 後序 (Postfix) | 運算元後面 | 由左至右 (Stack) | 否 |
轉換時最容易忘記「括號」。前序和後序本身不需要括號就能決定優先權,但轉成中序時,必須先嚴格加上括號 (運算元 運算子 運算元),最後再依據「先乘除後加減」的數學規則,把多餘的括號拿掉。若直接拿掉所有括號會選到 C 選項。