スタックとキュー|LIFO と FIFO、プログラムでの読み方【基本情報技術者試験 科目B】

基本情報技術者試験

現行FE シラバス Ver9.2 準拠擬似言語の記述形式は2022年から変更なし最終更新 2026-10-17

スタックは最後に入れたものから取り出すデータ構造、キューは最初に入れたものから取り出すデータ構造です。どちらも入れたものを一列に並べて持っていて、ちがうのは取り出す側だけです。

期間限定クーポンPR|Udemy の講座科目B オリジナル模試 3回分・60問42%OFF 1,500円2,600円中身を見る ›

スタック ── 最後に入れたものから取り出す

机に本を積むのと同じです。置くのはいちばん上、取るのもいちばん上。下の本は、上の本をどけるまで取れません。

スタックに入れる操作をプッシュ(push)、取り出す操作をポップ(pop)と呼びます。文字列 A、B、C をこの順にプッシュして、空になるまでポップします。図では積んだ山を横に倒して、右端を「いちばん上」として描きます。

スタック ── 入れるのも取り出すのも、右端

左ほど先に入れたもの / 緑=入れた / 赤の破線=取り出される

push を3回 ── A、B、C の順に入れた

A

B

C

pop の1回目 ── C が取り出される

A

B

C

取り出せるのは右端(最後に入れた側)だけ。残りは A、B。

pop の2回目 ── B が取り出される

A

B

残りは A。

pop の3回目 ── A が取り出される

A

これで空になった。

入れた順は A → B → C。取り出された順は C → B → A

最後に入れた C が、最初に出てきます。この取り出し方を LIFO(Last In First Out、後入れ先出し)といいます。

キュー ── 最初に入れたものから取り出す

レジの行列と同じです。並ぶのは最後尾、会計に進むのは先頭から。

キューに入れる操作を enqueue(エンキュー)、取り出す操作を dequeue(デキュー)と書きます。IPA が公開している科目Bのサンプル問題(問8)に出てくる名前です。スタックのときと同じ A、B、C を入れて、空になるまで取り出します。

キュー ── 入れるのは右端、取り出すのは左端

左ほど先に入れたもの / 緑=入れた / 赤の破線=取り出される

enqueue を3回 ── A、B、C の順に入れた

A

B

C

dequeue の1回目 ── A が取り出される

A

B

C

取り出せるのは左端(最初に入れた側)だけ。残りは B、C。

dequeue の2回目 ── B が取り出される

 

B

C

残りは C。

dequeue の3回目 ── C が取り出される

 

 

C

これで空になった。

入れた順は A → B → C。取り出された順も A → B → C

最初に入れた A が、最初に出てきます。この取り出し方を FIFO(First In First Out、先入れ先出し)といいます。

ちがいは、取り出す側だけ

入れるのは、スタックもキューも右端です。スタックは入れたのと同じ端から、キューは反対の端から取り出します。

プログラムでの読み方 ── 説明の表と、中身の書き出し

科目Bのサンプル問題 問8 では、enqueue と dequeue をもつデータ構造がクラスとして出ています。クラスは、整数型や文字列型と同じ「型」を、問題ごとに新しく用意したものです。中でどう作られているかは書かれず、呼び出せる操作(メソッド)の説明が、表の形の図で渡されます。同じ形をスタックで作ると、次のようになります。「コンストラクタ」は新しいスタックやキューを生成するときの書き方、「戻り値」は呼び出した結果として返ってくる値、「要素」は入っているもの1つ1つのことです。

コンストラクタ 説明
Stack() 空のスタックを生成する。
メソッド 戻り値 説明
push(文字列型: s) なし スタックに,文字列 s を要素として追加する。
pop() 文字列型 スタックからスタック内で最後に追加された要素を取り出して返す。

クラス Stack の説明(当サイトで作った例です)

動きを知る手がかりは、この説明の文だけです。pop の説明に「最後に追加された要素」とあるので、取り出すのは、いま入っている中で最後に入れたものだと分かります。名前から動きを決めつけず、説明の文で確かめます。

このクラスを使うプログラムです。

Stack: st ← Stack()
st.push("A")
st.push("B")
st.pop()  /* 戻り値は使用しない */
st.push("C")
st.pop() の戻り値を出力
st.pop() の戻り値を出力

当サイトで作った例です。

1行目は、コンストラクタで空のスタックを1つ作って st という名前を付ける行です。st.push("A") は、st に対して push を呼ぶと読みます(クラスとメソッドの読み方)。4行目の /* と */ で囲まれた部分は注釈(説明の書き込み)で、実行には関係しません。

中身を書き出して読む

  1. 取り出す側を、説明の文で確かめる。「最後に追加された要素」なら右端から、「最初に追加された要素」なら左端から取り出します。
  2. 呼び出しを1行読むたびに、中身を書き出す。入れた順に左から並べます。追加の行なら右端に足し、取り出しの行なら、確かめた側の端を消します。
  3. 出力されるのは「の戻り値を出力」と書かれた行だけ。4行目のように戻り値を使わない行でも、中身は1つ減ります。取り出した値が出力されないだけです。

この手順で、上のプログラムを1行ずつ進めます。

中身を1行ずつ書き出す

当サイトオリジナルの例題


ループ開始前

st の中身(左ほど先に入れたもの)

▲ いま読んでいる▲ いま書いた

いま計算していること

まだ計算していません

取り出した値

書き出した記録(進めると1行ずつ積み上がります)

出力は "C"、"A" の順です。

キューでも読み方は変わりません。メソッドの説明が次のとおりだったとします。

メソッド 戻り値 説明
enqueue(文字列型: s) なし キューに,文字列 s を要素として追加する。
dequeue() 文字列型 キューからキュー内で最初に追加された要素を取り出して返す。

クラス Queue の説明(当サイトで作った例です。コンストラクタは Queue())

さきほどの7行の push を enqueue に、pop を dequeue に替えて書き出します。説明が「最初に追加された要素」なので、取り出すのは左端です。

同じ並びの7行を、キューとして書き出す

取り出すのは左端。4行目だけ戻り値を使わない。「中身」は、その行を実行したあとの並び

行 呼び出し 戻り値 出力 中身
1 Queue() — — (空)
2 enqueue("A") — — A
3 enqueue("B") — — A、B
4 dequeue() A しない B
5 enqueue("C") — — B、C
6 dequeue() B "B" C
7 dequeue() C "C" (空)

出力は "B"、"C" の順。スタックのときは "C"、"A" だった

実際の出題では

科目Bのサンプル問題 問8 は優先度付きキューです。要素を入れるときに優先度(1〜3 の整数)を付け、入れた順ではなく、優先度の高いものから取り出されます(値が小さいほど優先度が高い、と問題文にあります)。どれを取り出すかは、やはりメソッドの説明の文に書かれています。prioQueue という名前を付けたキューに対して prioQueue.dequeue() の戻り値を出力 のように、ここで見たのと同じ書き方で出ています。戻り値を使わない取り出しの行に「戻り値は使用しない」の注釈が付くのも同じです(サンプル問題 問8 の解説)。

中の作りまで書かれている出題もあります。令和7年度 問3 は、スタックを配列と、次に値を格納する位置を示す変数で作っていて、push と pop の中の式が問われています。こちらは読み方が別なので、解説のほうで扱っています(令和7年度 問3 の解説)。

次に読む

A10-1 リストを読む ─ next をたどって、未定義で止まる
G12-2 クラスとメソッド ─ ◯◯.メソッド() の読み方
第2部 科目Bのアルゴリズム ─ 出るものの地図
目次 基本情報技術者試験 科目B 攻略ガイド

この記事で引用した資料

いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では、引用した箇所の文言を改変していません(省略や補いがある場合は、その場に明記しています)。

本文の例題は当サイトのオリジナルです。

タイトルとURLをコピーしました