程式設計基礎(虛擬碼追蹤)
有一個把元素數為4的字串型陣列 q 環狀使用的佇列。head 與 tail 的初值為1,enq(v) 執行 q[tail] ← v 後再執行 tail ← tail mod 4 + 1,deq() 回傳 q[head] 的值後執行 head ← head mod 4 + 1。執行下列程式時,「E」會存放在 q 的哪個元素?
enq("A")
enq("B")
enq("C")
deq()
deq()
enq("D")
enq("E")
- Aq[1]
- Bq[3]
- Cq[5]
查看答案與解析
正確答案:A. q[1]
mod 比 + 先計算,因此 tail ← tail mod 4 + 1 讓 tail 依 1 → 2 → 3 → 4 → 1 循環。A、B、C 放入 q[1]〜q[3],tail = 4。兩次 deq() 取出 A 與 B,head = 3。D 放入 q[4],tail 回到 4 mod 4 + 1 = 1,E 放入已空出的 q[1]。不把元素往前移,而是重複使用取出後空出的位置,這就是環狀佇列(環形緩衝區)。
- A. 正確。tail 在4之後回到1,E 放入已取出而空出的 q[1]。
- B. 這是以為每次取出都把剩下的元素往前移時的位置。此方式不會往前移。
- C. 這是讓 tail 在4之後前進到5時的位置,超出陣列的範圍。tail mod 4 + 1 會回到1。