免費開始練習
moea_joint_essay 105年 [統計資訊] 資料庫及資料探勘、程式設計

第 二 題

📖 題組:
請依算術運算式(((9+1)*3)/((7-6)+5))-((2*(3-2))+1),回答下列問題:
📝 此題為申論題,共 4 小題

小題 (二)

為求得運算式之值,可採「中序(infix)」、「前序(prefix)」或「後序(postfix)」等表示法,請從記憶體耗用、程式複雜度觀點,比較此 3 種表示法何者較佳?為什麼?(6 分)

思路引導 VIP

從記憶體耗用與複雜度考量,通常以「後序(postfix)」最佳,因為它不需要括號且能僅用一個堆疊完成 O(n) 的一次性掃描計算。

🤖
AI 詳解
AI 專屬家教

以「後序(postfix)」表示法為最佳。原因如下:

  1. 程式複雜度低:後序表示法去除了括號的干擾,且運算子的出現順序即為計算的先後順序。計算時只需要由左至右掃描一次(時間複雜度 O(n)),遇到運算元推入堆疊,遇到運算子即從堆疊取出兩值計算並放回,邏輯十分單純。相較之下,中序需要考慮運算子優先權及括號處理。
  2. 記憶體耗用少:計算過程只需一個線性陣列所實作的堆疊 (Stack) 即可;若是前序或中序,在實作求值時常需依賴遞迴 (Recursion) 而產生遞迴呼叫堆疊 (Call Stack) 的空間開銷,或需額外儲存抽象語法樹,使得耗用的記憶體較多。

小題 (一)

請繪出此算術運算式之二元樹,其終端節點均為運算元(1、2、3、5、..),非終端節點均為運算子(+、-、*、/)。(5 分)

思路引導 VIP

利用運算符號優先級與括號來建構樹狀結構。最外層的減號是樹的根節點。左子樹是除法結構,右子樹是加法結構。

🤖
AI 詳解
AI 專屬家教

本算術運算式可切分為左半部 (((9+1)3)/((7-6)+5)) 與右半部 ((2(3-2))+1),中間以減號相連。 二元樹結構如下: [-]

小題 (三)

請將此運算式,改為後序表示法(postfix expression)。(5 分)

思路引導 VIP

將中序式依樹的後序走訪規則(左->右->根)列出。

🤖
AI 詳解
AI 專屬家教

對第(一)題之二元樹進行後序走訪 (Post-order traversal: 左-右-中): 左半部:9 1 + 3 * 7 6 - 5 + / 右半部:2 3 2 - * 1 +

小題 (四)

欲使用堆疊(stack)來求得此算術運算式之解,請畫出該堆疊的資料歷程變化。(6 分)

思路引導 VIP

將後序式的元素逐一掃描並操作堆疊 (push 運算元,遇到運算子時 pop 兩次進行運算並將結果 push 回堆疊)。

🤖
AI 詳解
AI 專屬家教

後序表示法掃描順序與堆疊歷程如下 (右側為堆疊頂端):

  1. 讀 9 -> Stack: [9]
  2. 讀 1 -> Stack: [9, 1]

🏷️ 相關主題

程式設計演算法與資料結構實作
查看更多「[統計資訊] 資料庫及資料探勘、程式設計」的主題分類考古題