スタック・キューとは(全体像)
スタックとキューは、どちらもデータを順番に出し入れするしくみ。違いは取り出す順番にあり、ここが真逆になっている。
- スタック(LIFO) … 後に入れたものから取り出す(Last In First Out)。
- キュー(FIFO) … 先に入れたものから取り出す(First In First Out)。
身近なイメージで押さえると速い。スタックは「積み重ねた本」(一番上にしか置けず、一番上からしか取れない)。キューは「お店の行列」(並んだ順に処理される)。
操作の呼び名も違う。スタックはpush(積む)/pop(取り出す)、キューはenqueue(並ぶ)/dequeue(取り出す)。混同しないことが大事だ。
詳しく:LIFOとFIFO・用途だけ覚えれば戦える
ここが記事の心臓部。2つを並べて比べる。
スタックとキューの違い
| スタック | キュー | |
|---|---|---|
| 取り出す順 | 後入れ先出し(LIFO) | 先入れ先出し(FIFO) |
| 操作の名前 | push/pop | enqueue/dequeue |
| イメージ | 積み重ねた本 | お店の行列 |
いちばん大事なのが、取り出す順番が真逆だということ。スタックは「あとから入れたものが先に出る」、キューは「先に入れたものが先に出る」。ここを取り違えると大量に間違えるので注意だ。
次に、よく問われる用途との対応。
用途の対応
| 構造 | 主な用途 |
|---|---|
| スタック | 関数の呼び出し(コールスタック)・深さ優先探索(DFS)・取り消し(undo) |
| キュー | 幅優先探索(BFS)・処理の順番待ち(タスクキュー)・バッファ |
特に頻出なのが、深さ優先探索(DFS)=スタック、幅優先探索(BFS)=キューという対応。「奥まで進んで戻る探索はスタック」「近い順に広げる探索はキュー」とセットで覚える。つまり、進み方のイメージとデータ構造をひもづけると忘れにくい、というわけだね。なお、両端から出し入れできる両端キュー(Deque)もある。
わかりやすく言い換えると
要するに、スタックは「積み重ねた本」、キューは「お店の行列」だ。
①スタック(本の山) … 一番上の本しか取れない。だから「最後に置いた本」が最初に取れる(後入れ先出し)。
②キュー(行列) … 先に並んだ人から順に呼ばれる。だから「最初に並んだ人」が最初に処理される(先入れ先出し)。
探索との対応も、このイメージでつかめる。DFSは「行けるところまで奥へ進んで、行き止まりで戻る」=積んで戻すスタック向き。BFSは「近いところから順に広げる」=並んだ順のキュー向き、というわけだね。
試験のツボ
🔴 一番出る:LIFOとFIFOの区別
①スタック=後入れ先出し(LIFO)。最後に入れたものから取り出す
②キュー=先入れ先出し(FIFO)。先に入れたものから取り出す
🔴 次に出る:探索との対応
①深さ優先探索(DFS)=スタック
②幅優先探索(BFS)=キュー
🟡 押さえると安定:操作名と用途
①スタック=push/pop、キュー=enqueue/dequeue
②スタックはコールスタックやundo、キューはタスク待ちに使う
よくある間違い
①「スタックとキューは取り出す順番が同じである」→ ✗ 真逆。スタックは後入れ先出し、キューは先入れ先出し。
②「幅優先探索(BFS)はスタックを使う」→ ✗ BFSはキュー。スタックを使うのは深さ優先探索(DFS)。
③「pushとenqueueは同じ操作の別名である」→ ✗ pushはスタックの操作、enqueueはキューの操作。別もの。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(LIFOとFIFO)
スタックとキューに関する次の記述のうち、正しいものはどれか。
- スタックは先入れ先出し、キューは後入れ先出しで取り出す構造のことである
- スタックは後入れ先出し、キューは先入れ先出しで取り出す構造のことである
- スタックもキューも先に入れたものから取り出す、まったく同じ構造である
- スタックもキューも後に入れたものから取り出す、まったく同じ構造である
解答は 2 だよ。
スタックは後入れ先出し(LIFO)、キューは先入れ先出し(FIFO)なんだ。積んだ本は上から、行列は並んだ順、とイメージで押さえてね。
選択肢1はスタックとキューが逆。選択肢3・4は「同じ構造」としているけど、取り出す順番が真逆だよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | スタックとキューが逆 |
| 2 | ✓ | スタック=LIFO・キュー=FIFO |
| 3 | ✗ | 取り出す順が真逆で同じではない |
| 4 | ✗ | 取り出す順が真逆で同じではない |
オリジナル問題2(探索との対応)
探索アルゴリズムと使うデータ構造の対応に関する次の記述のうち、正しいものはどれか。
- 深さ優先探索も幅優先探索も、ともにキューを使って実現するものである
- 深さ優先探索はキューを使い、幅優先探索はスタックを使うものだとされている
- 深さ優先探索も幅優先探索も、データ構造はいっさい使わないものである
- 深さ優先探索はスタック、幅優先探索はキューを使って実現するものである
解答は 4 だよ。
深さ優先探索(DFS)はスタック、幅優先探索(BFS)はキューを使うんだ。「奥へ進んで戻るDFSは積むスタック、近い順に広げるBFSは並ぶキュー」と覚えてね。
選択肢1は「ともにキュー」が誤り。選択肢2はDFSとBFSが逆。選択肢3は「使わない」が誤りだよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | DFSはスタックを使う |
| 2 | ✗ | DFSとBFSが逆 |
| 3 | ✗ | それぞれデータ構造を使う |
| 4 | ✓ | DFS=スタック・BFS=キュー |
オリジナル問題3(操作名)
スタックとキューの操作に関する次の記述のうち、正しいものはどれか。
- スタックはpush/popで、キューはenqueue/dequeueで出し入れする
- スタックはenqueueで積み、キューはpushで並べて取り出すものであるとされている
- スタックもキューも操作名はまったく同じで、区別する必要はないものである
- スタックは取り出しができず、データを積むことだけができる構造である
解答は 1 だよ。
スタックはpush(積む)/pop(取り出す)、キューはenqueue(並ぶ)/dequeue(取り出す)なんだ。操作の名前で構造を見分けられるよ。
選択肢2はスタックとキューの操作名が逆。選択肢3は「同じ名前」が誤り。選択肢4は「取り出しができない」が誤りだよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | push/pop=スタック・enqueue/dequeue=キュー |
| 2 | ✗ | 操作名が逆 |
| 3 | ✗ | 操作名は異なる |
| 4 | ✗ | スタックも取り出せる(pop) |
まとめ
押さえどころ
- 🔴 取り出す順 = スタックは後入れ先出し(LIFO)、キューは先入れ先出し(FIFO)。真逆。
- 🔴 探索との対応 = 深さ優先探索(DFS)=スタック、幅優先探索(BFS)=キュー。
- 🟡 操作名と用途 = スタックはpush/pop(コールスタック・undo)、キューはenqueue/dequeue(タスク待ち)。
次に学ぶ
- 配列・リスト ── スタックやキューを作る土台になる基本データ構造。出し入れの自由度を比べると理解が深まる。
- 木構造・逆ポーランド記法 ── スタックで評価する逆ポーランド記法とつながる。スタックの使いどころが具体的になる。
執筆: SikakuQuest編集部