🔴 Tier A・全新演算法概念

堆疊與佇列

M1-11 堆疊與佇列

1什麼是堆疊與佇列

到目前為止,你操作清單的方式都是「用位置(索引)存取任何一個地方」——你可以直接跳到第5個、第10個位置去讀或改。但堆疊(Stack)和佇列(Queue)刻意限制你只能從固定的一端進出資料,換來的好處是:很多真實世界的行為,本來就是「有嚴格先後順序限制」的,用限制過的結構去模擬,反而比用任意存取的清單更直覺、更不容易寫錯。

堆疊 Stack=LIFO
後進先出,像一疊盤子

10
20
30 ← 最後放的最先拿走

佇列 Queue=FIFO
先進先出,像排隊結帳

10 ← 最先進的最先出
20
30
🆕 補充圖解:兩種結構「放入」的一端相同,但「取出」的一端剛好相反新增

這是你在資訊科學裡第一次接觸「限制存取方式」反而更有用的資料結構。之後你會發現:瀏覽器上一頁、程式的函式呼叫、括號配對、排隊叫號系統……很多系統背後都是堆疊或佇列在運作。學會辨認「這個情境該用堆疊還是佇列」,是這個單元最重要的能力。

2核心概念,依課程題目的順序拆解

1

堆疊——PUSH(放入頂端)與POP(移除頂端)

你要做的事:維護一個清單當作堆疊。收到「PUSH」指令,就把新數字加到清單最後面(當作頂端);收到「POP」指令,就把清單最後面的數字拿掉(如果清單是空的,這個指令直接跳過,不會出錯)。全部指令做完後,堆疊裡剩下的內容,由最底部到最頂部依序輸出。

堆疊操作模擬(M1-11-01)——指令代碼1=PUSH、2=POP

自己動手跑一次(指令 1 1 2 1 2,數字 10 20 0 30 0)

動作堆疊狀態(由底到頂)
PUSH 10[10]
PUSH 20[10, 20]
POP(移除頂端的20)[10]
PUSH 30[10, 30]
POP(移除頂端的30)[10] ← 最後結果
⚠️ 常見誤區
POP時忘記先判斷「堆疊是不是空的」——如果堆疊已經空了還硬要移除,程式會出錯或算出錯誤結果。堆疊操作永遠要先檢查「還有沒有東西可以拿」。
2

佇列——ENQUEUE(加到尾端)與DEQUEUE(從前端移除)

佇列跟堆疊唯一的差別,就是移除的那一端不一樣:堆疊從「跟放入同一端」移除(後進先出),佇列從「放入的另一端」移除(先進先出)。

佇列操作模擬(M1-11-02)——指令代碼1=ENQUEUE、2=DEQUEUE

自己動手跑一次(同一組指令 1 1 2 1 2,數字 10 20 0 30 0,跟堆疊版比較差異)

動作佇列狀態(前→後)
ENQUEUE 10[10]
ENQUEUE 20[10, 20]
DEQUEUE(移除最前面的10,不是20!)[20]
ENQUEUE 30[20, 30]
DEQUEUE(移除最前面的20)[30] ← 最後結果
⚠️ 常見誤區
跟堆疊搞混,DEQUEUE時錯拿了清單最後面的值而不是最前面的值。同樣一組指令、同樣的數字,堆疊版本最後剩 10,佇列版本最後剩 30——這個差異就是LIFO跟FIFO最直接的證明,遇到題目時先問自己:「這題是後進先出還是先進先出?」
3

堆疊的經典應用——括號配對

你要做的事:判斷一串括號字串是否「完全合法配對」(每個左括號都對應到一個右括號,順序也正確)。這是堆疊最經典的應用之一:不用真的維護一個清單堆疊,可以簡化成一個「深度」計數器——遇到左括號就+1(相當於PUSH),遇到右括號就-1(相當於POP)。如果過程中深度變成負的(代表右括號在對應的左括號之前出現),或是最後深度不是0(代表有左括號沒被配對),就是不合法。

括號配對是否合法(M1-11-03)

⚠️ 常見誤區
只檢查「左右括號數量相不相等」,忽略了順序。例如 )( 左右括號數量相等,但明顯不合法(右括號先出現)——一定要用「深度計數器不能變負數」這個規則,數量相等不代表順序正確。
4

堆疊的經典應用——瀏覽器上一頁

你要做的事:模擬瀏覽器的「造訪新頁面」與「按上一頁」——造訪新頁面時把頁面代碼PUSH進瀏覽紀錄;按上一頁時POP掉目前頁面,回到堆疊裡的上一個。這是堆疊在真實軟體裡最常被提到的例子:你永遠只能回到「最近造訪的上一頁」,不能跳著回去,這正是LIFO的行為模式。

瀏覽器上一頁模擬(M1-11-04)

⚠️ 常見誤區
跟概念1一樣,忘記處理「已經沒有上一頁可以回」的情況(堆疊是空的時候按上一頁,指令要跳過,不能讓程式出錯)。
5

佇列的經典應用——排隊叫號系統

「排隊叫號系統模擬」(M1-11-05)是佇列在生活中最直接的對應:先來的先被叫號、先被服務,這正是FIFO。做這一題時,先確認你能分辨「這是佇列情境」,再套用概念2的ENQUEUE/DEQUEUE操作。
6

綜合應用——奇偶分流交錯重組

「奇偶分流交錯重組」(M1-11-06)是這個單元最後的綜合題,把資料依某個規則分流(例如奇數位置一群、偶數位置一群),再依照特定順序重新組合輸出。做這一題前,建議先想清楚:這個題目裡「分流」跟「重組」各自比較適合用堆疊還是佇列的邏輯處理,再動手寫。

3建議練習順序對照表

順序概念題目課程
1堆疊:PUSH/POP堆疊操作模擬(M1-11-01)M1-11
2佇列:ENQUEUE/DEQUEUE佇列操作模擬(M1-11-02)M1-11
3堆疊應用:括號配對括號配對是否合法(M1-11-03)M1-11
4堆疊應用:瀏覽紀錄瀏覽器上一頁模擬(M1-11-04)M1-11
5佇列應用:排隊叫號排隊叫號系統模擬(M1-11-05)M1-11
6綜合應用奇偶分流交錯重組(M1-11-06)M1-11
🆕 本頁新增內容說明
以下視覺元素為 Cowork 潤飾時新增,MD 正本中沒有:① 堆疊/佇列並排對照圖解。原MD文字版「自己動手跑一次」步驟已改繪成本頁表格(數值內容相同,僅呈現方式改變)。若確認保留,建議之後補進 MD 正本。