「スタック」と「キュー」、どちらもデータを一時的にためておく仕組みですが、取り出す順番が正反対です。編集部でもアルゴリズムの学習を振り返りながら、身近なものにたとえて整理してみました。
まず結論:スタックとキューは「取り出す順番」が違う
- スタックは、最後に入れたものを最初に取り出す「後入れ先出し(LIFO)」の仕組み
- キューは、最初に入れたものを最初に取り出す「先入れ先出し(FIFO)」の仕組み
- どちらも「データを一時的に保管する」点は同じだが、取り出す順序が正反対になる

スタックとは?――積み重ねたお皿の山のようなもの
スタックは、データを積み重ねるように格納し、最後に積んだものから順に取り出す仕組みです。この性質を「後入れ先出し(LIFO:Last In First Out)」と呼びます。
これは、シンクに積み重ねたお皿の山のようなものだと考えています。一番上に置いたお皿(最後に積んだお皿)を、一番先に取ることになります。下のほうにあるお皿を先に取ろうとすると、上のお皿をどかす必要があります。
ブラウザの「戻る」ボタンは、このスタックの仕組みに近い動きをします。直前に見ていたページ(最後に積んだもの)から順番に戻っていく、という動作は、お皿を上から取っていく感覚と重なります。
キューとは?――レジや窓口に並ぶ行列のようなもの
キューは、データを追加した順番のまま並べておき、最初に追加したものから順に取り出す仕組みです。この性質を「先入れ先出し(FIFO:First In First Out)」と呼びます。
これは、レジや窓口に並ぶ行列のようなものだと考えています。先に並んだ人(最初に入れたもの)から順番に案内されます。後から並んだ人が先に案内されることは、通常はありません。
印刷待ちのプリンタジョブや、通知の表示順など、「先に依頼された処理から順番に処理したい」場面で、このキューの仕組みが使われています。
「スタックとキューの違い」を積み重ねと行列でわかりやすく解説
| 観点 | スタック | キュー |
|---|---|---|
| たとえ | 積み重ねたお皿の山 | レジや窓口の行列 |
| 取り出す順番 | 後入れ先出し(LIFO) | 先入れ先出し(FIFO) |
| データを入れる操作 | プッシュ(push) | エンキュー(enqueue) |
| データを取り出す操作 | ポップ(pop) | デキュー(dequeue) |
| 代表的な使われ方 | ブラウザの「戻る」機能・関数呼び出しの管理 | 印刷待ちの管理・通知の順番待ち |
お皿の山では、下のほうに置いたお皿を先に取り出すのは手間がかかります。一方、行列では、後から並んだ人を先に案内すると、周りから不公平だと思われてしまいます。スタックとキューは、それぞれの用途に合わせて「どちらの順番で取り出したいか」を基準に使い分けるものだと編集部では捉えています。
なぜスタックだけ(またはキューだけ)ではダメなのか?
「どちらか一方の仕組みだけ覚えておけば十分では」と思うかもしれませんが、扱うデータの性質によって、適した仕組みが変わります。
たとえば、関数の呼び出し関係を管理する場合、直前に呼び出した処理から順に終わらせていく必要があるため、スタックの仕組み(後入れ先出し)が適しています。プログラムの中で「関数Aから関数Bを呼び、関数Bから関数Cを呼ぶ」という状態のとき、先に終わるべきなのは一番最後に呼ばれた関数Cです。これをキュー(先入れ先出し)で管理してしまうと、呼び出し順序と終了順序がかみ合わなくなってしまいます。
逆に、印刷待ちのジョブや窓口の順番のように、「依頼した順番を守って処理してほしい」場面では、キューの仕組みが適しています。ここでスタックを使ってしまうと、後から依頼した処理が先に実行されてしまい、最初に依頼した人がいつまでも処理されない、という不公平が生まれます。
データの性質と目的に応じて、どちらの順序で処理すべきかを見極めることが大切だと考えています。
実際の使われ方:スタックとキューが使われる代表的な場面
1. スタックの例:関数呼び出しの管理(コールスタック)。プログラム内である関数から別の関数を呼び出すたびに情報が積まれ、呼び出された関数の処理が終わるたびに、最後に積まれた情報から順に取り除かれる
2. スタックの例:ブラウザの「戻る」機能。閲覧したページの履歴が積み重なり、直前に見たページから順に戻っていく
3. キューの例:プリンタの印刷待ち。先に印刷を依頼したファイルから順番に印刷される
4. キューの例:タスク処理の順番待ち。複数の処理依頼を受け付けた順に、1つずつ処理していく
この2つの仕組みは、データ構造の基礎として、より複雑なアルゴリズムやプログラムの動作を理解するための土台になっていると理解しています。
まとめ:3行で理解するスタックとキュー
スタックは最後に入れたものを先に取り出す「後入れ先出し」、キューは最初に入れたものを先に取り出す「先入れ先出し」の仕組みです。関数呼び出しの管理にはスタック、順番待ちの処理にはキューが適しています。どちらも「データを一時的にためる」という目的は同じでも、取り出す順番の違いが用途を分けている、と捉えておくとよさそうです。
お皿の山と行列、という身近なイメージで覚えておくと、試験問題でも迷いにくくなると編集部では感じています。
よくある質問
Q1. スタックとキュー、どちらのほうが処理速度が速いですか?
どちらが一律に速いというものではありません。データを追加・取り出す操作自体は、スタックもキューも基本的に高速に処理できるよう設計されています。速度の違いよりも、「どの順番でデータを取り出したいか」という目的に応じて使い分けることが重要だと編集部では考えています。
Q2. デック(Deque)とは何ですか?
デック(Double-Ended Queue)は、両端からデータの追加・取り出しができるデータ構造です。スタックとキューの両方の性質を併せ持つ仕組みとして扱われることが多く、片方の端からはスタックのように、もう片方の端からはキューのように使うこともできます。基本情報技術者試験の学習範囲では、スタック・キューの発展形として名前だけ押さえておくと理解がスムーズになります。
Q3. 基本情報技術者試験ではどのように出題されますか?
「後入れ先出し」「先入れ先出し」という用語とスタック・キューの対応関係を問う問題や、具体的なデータの出し入れの流れを図で示して、最終的にどの順番でデータが取り出されるかを答えさせる問題が出やすい傾向にあると編集部では見ています。最新の出題範囲は情報処理推進機構(IPA)の公式サイトで確認することをおすすめします。
参考:[IPA 独立行政法人情報処理推進機構](https://www.ipa.go.jp/shiken/)


コメント