対象試験と出題頻度
スタック(LIFO)は、ITパスポート・基本情報技術者・応用情報技術者のすべてで出題されるテーマです。
「スタックを使って出力可能なデータ列を選べ」という操作問題が定番化しており、キュー(FIFO)との違いを正確に区別できるかが問われます。
詳細をクリックして確認
ITパスポート
基本情報技術者
応用情報技術者
★★★★☆
ランクA(重要)必ず覚えておくべき
用語の定義
情報処理試験を勉強していると、「スタックって結局何?キューと何が違うの?」と混乱しがちです。
スタック(Stack)とは、一言で言うと
「最後に入れたデータが最初に取り出される、後入れ先出し(LIFO:Last In First Out)方式のデータ構造」
のことです。
イメージとしては、「積み上げた本の山」です。
机に本を1冊ずつ積み上げていくと、取り出せるのは一番上の1冊だけです。途中の本を引き抜くことはできません。最後に載せた本が最初に取り出される。これがスタックの考え方です。
📊 スタックの基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | Stack(stack=積み重ねる) |
| データ取り出し方式 | LIFO(Last In First Out:後入れ先出し) |
| 基本操作 | PUSH(データを積む)/POP(データを取り出す) |
| 代表的な用途 | サブルーチンの戻り番地保存、逆ポーランド記法の計算、Undo機能 |
解説
配列やリストが「データの物理的な格納方法」を定めるのに対し、スタックは「データの出し入れルール」を定めた抽象データ型です。
内部的には配列や連結リストで実装されますが、外から使う側が意識するのはPUSHとPOPの2つの操作だけです。
PUSHとPOPの動き
スタックの操作は2つしかありません。
PUSH(データを一番上に積む)とPOP(一番上のデータを取り出す)です。途中のデータを直接参照・削除することはできないというのがルールです。
▶ PUSH・POPの操作を図で確認(クリックで展開)
A → B → C の順にPUSHし、その後POPする例です。
A→B→Cの順にPUSHすると、取り出し順は必ずC→B→Aになります。入れた順の逆順で出てくるのがLIFOの特徴です。
スタックが使われる場面
コンピュータ内部ではスタックが至るところで使われています。代表例はサブルーチン(関数)の呼び出しです。
メインルーチンからサブルーチンAを呼び、さらにAの中からサブルーチンBを呼ぶと、戻り番地はB→Aの順に必要になります。最後に呼んだBの戻り番地を最初に取り出す必要があるため、LIFOのスタックが最適です。
逆ポーランド記法の計算でもスタックが活用されます。数値をPUSHしていき、演算子が現れたらPOPで2つ取り出して計算し、結果を再度PUSHする。この繰り返しで複雑な数式を処理できます。
キュー(FIFO)との対比
スタックと対になる構造がキュー(Queue)です。
キューは「先入れ先出し(FIFO:First In First Out)」で、先に入れたデータから順に取り出します。コンビニのレジ待ちの行列と同じルールです。
| 項目 | スタック | キュー |
|---|---|---|
| 方式 | LIFO(後入れ先出し) | FIFO(先入れ先出し) |
| 日常の例え | 積み上げた本 | レジ待ちの行列 |
| 追加操作 | PUSH | エンキュー(ENQ) |
| 取出し操作 | POP | デキュー(DEQ) |
| 代表的な用途 | サブルーチンの戻り番地保存 | 印刷ジョブの待ち行列(スプーリング) |
ここだけは確実に押さえてください。「LIFO=スタック=後入れ先出し」「FIFO=キュー=先入れ先出し」です。この対応を取り違えると即失点になります。
では、この用語が試験でどのように出題されるか見ていきましょう。
💡 スタック(LIFO)の核心を3行で
・最後に入れたデータが最初に取り出される「後入れ先出し」のデータ構造
・操作はPUSH(積む)とPOP(取り出す)の2つだけ
・キュー(FIFO=先入れ先出し)と混同しないよう、操作名と方式をセットで覚える
試験ではこう出る!
スタックは、データの出力順を問う操作問題として各試験区分で繰り返し出題されています。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| IP R1秋 問62 |
データA〜Dをスタックに入力し、出力可能なデータ列を選ぶ問題。 | ・PUSH/POPのタイミングを自由に組み合わせてトレースする ・「後入れ先出し」のルールに反する選択肢を排除できるか |
| FE H29秋 午前 問5 |
A〜Dの順に到着するデータに対し、スタック1つで出力可能なデータ列を選ぶ問題。 | ・H22秋 問5、H16春 問12と同一問題(流用) ・PUSH/POPの手順を1ステップずつ追えるかがカギ |
| AP R3春 午前 問5 |
A〜Cの3データについて、出力順序が何通りあるかを問う問題。 | ・6通りの全パターンを検証し、不可能な順序を除外する ・R7春 問5、H28春 問5、H24春 問6でも同一問題が流用 |
📝 IPA試験での出題パターン
パターン1:「出力可能なデータ列を選べ」
4つの出力順が並び、スタック1つで実現できるものを選ぶ形式。解き方は「各選択肢に対して、PUSH/POPを1ステップずつ手で追う」こと。先にPUSHされたデータが、後からPUSHされたデータより先にPOPされている選択肢は不可能と判断できる。
パターン2:「出力順序は何通りあるか」
AP R3春のように、可能な出力パターンの総数を問う形式。データ数が3つなら全6通りを検証すれば解ける。コツは「後からPUSHされた要素をPOPした後、その要素より2つ以上前にPUSHされた要素を連続でPOPすることは不可能」という法則を使って不可能パターンを素早く排除すること。
パターン3:「スタックの用語・定義を選べ」
IP H28秋 問92やFE H15秋 問13のように、LIFOの定義やPUSH/POPの用語を選ばせる知識問題。キューのFIFO・エンキュー・デキューとの混同がひっかけポイント。
試験ではここまででOKです。操作問題は手を動かしてPUSH/POPをたどれば確実に正解できます。深追いは不要です。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. スタックに関する記述として、最も適切なものはどれでしょうか?
- A. 最初に格納されたデータが最初に取り出される構造であり、データの追加をエンキュー、取出しをデキューと呼ぶ。
- B. 最後に格納されたデータが最初に取り出される構造であり、データの追加をPUSH、取出しをPOPと呼ぶ。
- C. データを添字(インデックス)で直接参照できる構造であり、要素数にかかわらず一定時間でアクセスできる。
正解と解説を見る
正解:B
解説:
スタックは「最後に格納されたデータが最初に取り出される(LIFO)」構造であり、データの追加操作をPUSH、取出し操作をPOPと呼びます。
選択肢Aはキュー(Queue)の説明です。キューは「最初に格納されたデータが最初に取り出される(FIFO)」構造で、操作名はエンキューとデキューです。選択肢Cは配列(Array)の説明です。配列はメモリ上の連続領域に格納し、添字からアドレスを計算して直接参照する構造であり、データの出し入れルールとは別の概念です。
よくある質問(FAQ)
Q. 「スタック領域」と「ヒープ領域」の違いは何ですか?
プログラムの実行時に使われるメモリ領域の名前です。スタック領域は関数の呼び出しごとにLIFO方式で自動的に確保・解放される領域で、ローカル変数や戻り番地の保存に使われます。ヒープ領域はプログラムが明示的に確保・解放する領域で、サイズが動的に変わるデータの格納に向いています。AP H31春 午前問17で両者の違いが出題されました。
Q. 「スタックオーバーフロー」とは何ですか?
スタック領域の容量を超えてデータが積まれた場合に発生するエラーです。再帰呼出し(関数が自分自身を呼び出す処理)で終了条件を誤ると、戻り番地が際限なくPUSHされ続けてスタックオーバーフローが起きます。プログラミングの質問サイト「Stack Overflow」の名前の由来でもあります。
Q. 操作問題で「出力不可能」を素早く見抜くコツはありますか?
「先にPUSHされたデータX」と「後からPUSHされたデータY」がスタック内に同時に存在する場合、Yより先にXをPOPすることは絶対にできません。選択肢を見て「入力順で先のデータが、後のデータより先に出力されている箇所」がないかをチェックすれば、全手順をトレースせずに不可能パターンを排除できます。ただし、PUSHとPOPを自由なタイミングで行える点に注意してください。「Aを入力してすぐPOPし、その後Bを入力する」ような操作も可能なので、単純に入力の逆順でない=不可能、とは限りません。