cover

視覺化概覽

graph LR
    EN["enqueue"] ==>|"加入尾端"| REAR
    subgraph FIFO 佇列
        REAR["尾端 40"] --- C["30"] --- B["20"] --- FRONT["頭端 10"]
    end
    FRONT ==>|"取出頭端"| DE["dequeue"]
    style EN fill:#9f9,stroke:#333
    style DE fill:#f99,stroke:#333
    style REAR fill:#bbf,stroke:#333
    style FRONT fill:#bbf,stroke:#333

💡 白話版:Queue 就像排隊買飯。先到的先買,後到的後買(FIFO)。印表機的列印佇列就是這個原理。

什麼是佇列?

佇列就像排隊,先來的先處理。

先進先出 (FIFO - First In First Out)

enqueue →  [40] [30] [20] [10]  → dequeue
           rear            front
           (加入)          (取出)

Stack vs Queue

比較StackQueue
原則後進先出 LIFO先進先出 FIFO
比喻一疊盤子排隊買票
加入push (頂端)enqueue (尾端)
取出pop (頂端)dequeue (頭端)

核心操作

操作說明時間
enqueue(x)加入到尾端O(1)
dequeue()取出頭端O(1)
peek()查看頭端O(1)
isEmpty()是否為空O(1)

Enqueue 操作

enqueue(40):

front              rear
  ↓                  ↓
[10] [20] [30]  →  [10] [20] [30] [40]
                                   ↑
                               新加入

Dequeue 操作

dequeue() = 10:

front              rear
  ↓                  ↓
[10] [20] [30]  →  [20] [30]
  ↑                  ↑
取出              新的 front

環形陣列 (Circular Array)

問題

用普通陣列實作 Queue,dequeue 後前面會空出來:

dequeue 3 次後:
[__, __, __, 40, 50]
              ↑
           front

陣列前面浪費了!

解法:環形

讓 rear 繞回開頭使用空位:

陣列: [60, 70, __, 40, 50]
            ↑   ↑
          rear front

邏輯上: [40] [50] [60] [70]
        front           rear

關鍵公式:

rear = (rear + 1) % capacity;   // rear 往後移
front = (front + 1) % capacity; // front 往後移

經典應用

1. 任務排程

印表機佇列:
  enqueue(文件A)
  enqueue(文件B)
  enqueue(文件C)

列印順序: A → B → C (先來先印)

2. 廣度優先搜尋 (BFS)

圖的走訪,一層一層往外擴展
需要 Queue 來記錄「待訪問」的節點

3. 訊息佇列 (Message Queue)

生產者 → [Queue] → 消費者
         訊息按順序處理

4. 緩衝區 (Buffer)

鍵盤輸入 → [Buffer Queue] → 程式處理
           暫存輸入,依序處理

變體

雙端佇列 (Deque)

兩端都可以加入和取出:

addFirst ← [10] [20] [30] → addLast
removeFirst ←           → removeLast

優先佇列 (Priority Queue)

不是 FIFO,而是按優先順序取出(用 Heap 實作)。

什麼時候用 Queue?

  • 需要「先處理先來的」場景
  • 廣度優先搜尋 (BFS)
  • 任務排程、事件處理
  • 緩衝、流量控制

相關檔案