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 正本。