先進先出,像排隊買珍奶 —— 尾端排進來、前端走出去。公平,而且兩端都 O(1)。
deque),兩端進出都是 O(1)。
兩個開口 —— 尾端 rear 進、前端 front 出。跟堆疊「只有一個開口」不同。
enqueue(入隊) —— 新元素排到尾端。
dequeue(出隊) —— 從前端拿走最早進來的那個。
peek / front(看頭) —— 看最前面是誰,但不拿走。
先進先出(FIFO) —— 誰先來誰先走,公平排隊。
用 list 當佇列有陷阱 —— enqueue 用 append(尾端,O(1))沒問題;但 dequeue 若用 pop(0)(從頭拿),會逼後面每一格往前搬一格 → O(n)!
資料一多,pop(0) 就是效能殺手 —— 這是新手最常踩的雷。
collections.deque 才是正解 —— 它是雙端佇列,兩端 append / popleft 都是 O(1)。
要執行緒安全或跨程序 —— 還有 queue.Queue、multiprocessing.Queue(範例 7)。
先排的先買到,新來的乖乖排最後面。沒有人可以插隊(不然就不是佇列了)。
先送出的文件先印,後送的排後面等。
照抵達順序上車,一批一批來,先到先玩。
按 enqueue 把「待入隊」最左邊那個排到尾端,dequeue 從前端拿走最早進來的,peek 看一眼最前面。綠色是 front(下一個要走的)、紫色是 rear(剛排進來的)。看清楚:進出是兩頭,先進的先出。
從 deque 正解、Queue class,到 BFS、環形佇列、滑動視窗、優先佇列預告等應用。
❌ 用 list.pop(0) 當出隊 —— O(n) 效能雷,改用 deque.popleft()。
❌ dequeue / front 前沒檢查空佇列 —— 對空的 popleft() 會 IndexError,先 if q:。
❌ 搞混 front / rear —— 用 deque 要 append 進(rear)、popleft 出(front);若寫成 append + pop 就變堆疊了。
❌ 需要後進先出卻用佇列 —— 那要的是堆疊(上一頁),別搞反。
enqueue(1)、enqueue(2)、dequeue()、enqueue(3)、dequeue(),最後佇列剩什麼?front 是誰?deque.popleft() 是 O(1),而 list.pop(0) 是 O(n)?差在哪裡?把答案打到對話裡,我幫你對。