どちらも両端でO(1)の線形ADTですが、削除の順序が逆です。スタックはLIFO(最新が最初)、キューはFIFO(最古が最初)です。問題が必要とする順序に合わせて構造を選びましょう。
なぜ重要なのか
text
Stack (LIFO): push 1,2,3 -> pop order 3,2,1
Queue (FIFO): enq 1,2,3 -> deq order 1,2,3
どちらも両端でO(1)の線形ADTですが、削除の順序が逆です。スタックはLIFO(最新が最初)、キューはFIFO(最古が最初)です。問題が必要とする順序に合わせて構造を選びましょう。
Stack (LIFO): push 1,2,3 -> pop order 3,2,1
Queue (FIFO): enq 1,2,3 -> deq order 1,2,3
| スタックを使う場合... | キューを使う場合... |
|---|
| Undo/Redo(最新のアクション優先) | ジョブスケジューリング(到着順序) |
| ブラウザの戻るボタン | プリントスプーラ / タスクキュー |
| 関数呼び出し/再帰 | BFS / グラフの最短経路 |
| 括弧のマッチング、パース | サービス間のメッセージバッファリング |
| DFS(最深部を優先に探索) | レート制限 / リクエスト処理 |
# DFS uses a stack: explore newest branch first
stack = [start]
while stack:
node = stack.pop() # LIFO -> goes deep
for nb in graph[node]: stack.append(nb)
# BFS uses a queue: explore nearest first
from collections import deque
q = deque([start])
while q:
node = q.popleft() # FIFO -> goes level by level
for nb in graph[node]: q.append(nb)
LIFO vs FIFOの選択はアルゴリズムの動作を直接変えます。同じグラフ走査でも、スタックではDFS、キューではBFSになります。
問題が「最新」を必要とするのか「最古が最初」を必要とするのかを認識することで、正しい構造がすぐに見えてきます。