スタックとキューの可視化 — LIFO・FIFOを操作して体感
データを「ためて、取り出す」ときの2つの基本的な入れ物が、スタックとキューです。違いは取り出す向きだけ。スタックは後に入れたものから(LIFO)、キューは先に入れたものから(FIFO)出てきます。両方に同じ順番で数を入れて、取り出す順がどう変わるかを見てください。
スタック(LIFO:後入れ先出し)
積み上げた本や皿と同じ。入れるのも取り出すのも「上」からだけ。
(出入口)↓ 底
キュー(FIFO:先入れ先出し)
レジや改札の行列と同じ。後ろから並び、前から抜けていく。
スタックとキューは「出入りの向き」が違うだけ
どちらも「データを順番にためて、あとで取り出す」入れ物です。違いは1点、どこから取り出すかだけ。スタックは入れた口(上)からそのまま取り出し、キューは入れた口(後ろ)とは反対側(前)から取り出します。だから、同じ 1→2→3 の順で入れても、スタックは 3→2→1、キューは 1→2→3 の順で出てきます。上の2つで実際に確かめてみてください。
スタック(LIFO)とは — 後入れ先出し
最後に入れたものが最初に出る(Last In, First Out)構造です。操作は「積む=プッシュ(push)」「取り出す=ポップ(pop)」の2つだけ。身近な使われ方はたくさんあります。
・関数の呼び出し履歴(コールスタック):呼び出した関数を積み、終わった順(=後に呼んだ順)に戻る
・ブラウザやエディタの「戻る/Undo」:直前の操作から取り消す
・式の計算(逆ポーランド記法):値を積み、演算子で取り出して計算する
キュー(FIFO)とは — 先入れ先出し
最初に入れたものが最初に出る(First In, First Out)構造です。操作は「後ろに並べる=エンキュー(enqueue)」「前から出す=デキュー(dequeue)」。順番を守って処理したい場面で使われます。
・印刷ジョブや順番待ちの処理:依頼された順にさばく
・幅優先探索(BFS):探索の「次に見る候補」を並べる
・バッファ:受け取ったデータを届いた順に処理する
つまずきやすいポイント
「先入れ先出し」はキュー、スタックは逆。 用語が紛らわしいときは身近な物で覚えると確実です。スタック=積み上げた皿(上から取るので最後に置いた皿が先に出る)、キュー=レジの行列(先に並んだ人から会計が済む)。この2つのイメージがあれば、LIFO/FIFOを取り違えません。
空なのに取り出す・満杯なのに入れる。 中身が空のスタックをポップしたり、空のキューをデキューしようとすると取り出すものがありません(アンダーフロー)。逆に、サイズに上限がある実装では、満杯なのに入れようとするとあふれます(オーバーフロー)。プログラムでは、取り出す前に「空でないか」を確認するのが基本です。
スタックの「中ほど」は直接触れない。 スタックもキューも、出入口以外の要素に直接アクセスするための構造ではありません。配列のように「3番目を見る」ことが目的なら、そもそも別のデータ構造が向いています。あくまで「出入りの順番」を管理するための入れ物です。
🧩 アルゴリズムをもっと動かすなら:コールスタックの動きは 擬似言語ステッパー の関数呼び出しで、キューを使う探索は 探索アルゴリズム で、並べ替えは ソートアルゴリズム で確かめられます。データ構造全体の解説は データ構造の記事 をどうぞ。
基本情報技術者試験ではこう出る
「スタックはLIFO、キューはFIFO」の対応、プッシュ/ポップを順に行った後のスタックの中身、逆ポーランド記法(後置記法)をスタックで評価する問題、関数呼び出しとコールスタックの関係などが定番です。スタック=後入れ先出し、キュー=先入れ先出しを、上の操作で手を動かして覚えれば、この分野は確実に得点源になります。関連:データ構造 / 擬似言語ステッパー / 可視化一覧。
📖 記事で深掘り:スタック・キュー・木構造をやさしく図解 / 計算量とO記法