スタックとキューを混同しない|追加途中の取り出し順を比べる練習

執筆・編集:まっく部長公開日:

A、Bの順に入れて1つ取り出します。スタックならB、通常のキューならAが出てきます。スタックは今ある中で最後に入れた要素、キューは最初に入れた要素を取り出すからです。取り出した要素は元の列からなくなります。

次の例では、A〜Eの追加と取り出しを合わせて10回行います。結果はスタックがB・D・C・E・A、キューがA・B・C・D・Eです。スタックだからといって、すべてを逆順に並べればよいわけではありません。

目次

スタックは上端、キューは先頭から取り出す

追加途中で取り出す場合も、その時点の上端または先頭を選び、残る列と出力済みの列を分離できる。

このページでは両方とも右端に追加します。取り出すのはスタックなら右端、通常のキューなら左端です。取り出した要素は残る列から取り除きます。

構造・表の左→右追加取り出し
スタック
底→上
右端へ1つ加える右端の1つを取り出して取り除く
通常のキュー
先頭→末尾
右端へ1つ加える左端の1つを取り出して取り除く

スタックは後入れ先出し、通常のキューは先入れ先出しです。ここでの左右は説明用に固定しています。別の問題が上下や逆向きの図を使う場合は、その図で定められた上端・先頭を基準にします。

自作教材の前提
  • どちらも空の状態から始める。追加できる容量の上限は設けない
  • 1回の取り出しで1要素だけを取り除き、その要素を出力列の末尾へ書く
  • 空の状態で取り出そうとしたら、この教材では不正な操作として停止する。0や空文字の出力を作らない
  • 優先度付きキュー・循環配列・スタックポインタの実装は扱わない

push・pop・enqueue・dequeueなどの名前があっても、初期状態や戻り値、空のときの動作は問題文の定義が基準です。この教材では表の左右を固定して操作を追います。

10操作の途中で取り出すと出力順が分かれる

  1. Aを追加
  2. Bを追加
  3. 1つ取り出す
  4. Cを追加
  5. Dを追加
  6. 1つ取り出す
  7. 1つ取り出す
  8. Eを追加
  9. 1つ取り出す
  10. 1つ取り出す
10操作の残りと取り出しを比べる
手順・操作スタック(底→上)キュー(先頭→末尾)
1 追加 A残り [A]
取り出し なし
残り [A]
取り出し なし
2 追加 B残り [A, B]
取り出し なし
残り [A, B]
取り出し なし
3 取り出し残り [A]
取り出し B
残り [B]
取り出し A
4 追加 C残り [A, C]
取り出し なし
残り [B, C]
取り出し なし
5 追加 D残り [A, C, D]
取り出し なし
残り [B, C, D]
取り出し なし
6 取り出し残り [A, C]
取り出し D
残り [C, D]
取り出し B
7 取り出し残り [A]
取り出し C
残り [D]
取り出し C
8 追加 E残り [A, E]
取り出し なし
残り [D, E]
取り出し なし
9 取り出し残り [A]
取り出し E
残り [E]
取り出し D
10 取り出し残り 空
取り出し A
残り 空
取り出し E
各セルは操作後の残りと、その操作で取り出した要素。出力済みの全要素とは別

A〜Eは別々の要素です。各構造を空から始め、操作後の残りと出力済みの列を分けて追います。答えを隠して練習する場合も、この二つを書けば状態の変化をたどれます。

スタックはB・D・C・E・Aになる

スタックの取り出し順と理由を開く

取り出した順はB・D・C・E・Aです。3の時点ではAとBしか入っていないのでBを取り出し、6では追加済みのCとDのうち上にあるDを取り出しています。

E・D・C・B・Aになるのは、A〜Eをすべて入れ終わってから取り出した場合です。今回は手順3で最初に取り出すので、まだC・D・Eは入っていません。その時点で上にあるBが最初の答えになります。

キューはA・B・C・D・Eになる

キューの取り出し順と理由を開く

キューの取り出し順はA・B・C・D・Eです。手順6の前にはB・C・Dが残り、その中で最初に入ったBを取り出します。手順3で取り出したAはすでに列から消えています。

残りが空でも出力順が同じとは限らない

10操作後は両方とも空ですが、出力順は異なります。途中の手順7ではスタックにA、キューにDが残っています。出力済みの列もそれぞれB・D・CとA・B・Cです。

手順7までに4つ入れて3つ取り出すので、1つ残ります。残ったものはスタックがA、キューがDです。1つ残る点は同じでも、残る要素はAとDに分かれます。ここにも取り出す順序の違いが表れています。

取り出した要素を消し忘れると次の答えがずれる

スタックの手順6でDを出した後にはA・Cが残ります。Dを消し忘れると、次の手順7でもDを取ってしまいます。取り出したものを出力に書き、元の列から消すところまでが一つの操作です。

スタックの手順3でAを選んだ場合は、取り出す側が逆です。A・Bのうち右端のBを取ります。キューの手順6でDを選んだ場合も同じで、B・C・Dのうち取るのは左端のBです。

全て追加してから取り出す場合だけスタックは逆順になる

A・B・C・D・Eを全て追加してから5回取り出すなら、スタックの出力はE・D・C・B・Aです。元の10操作と違うのは、途中では取り出さず追加を終えてから始める点です。

操作順を変えた答えを開く

通常のキューは、この条件でもA・B・C・D・Eです。取り出すタイミングを後へ移すとスタックの出力は変わりますが、キューでは最初に入った要素から順に出てきます。

スタックは「全て追加済みなら追加順の逆」と説明できますが、追加と取り出しが途中で交互に入る問題では、その時点で残っている上端を見ます。

同じ値があると出力値だけでは構造を見分けられない

別の自作問題として、P=8・Q=3・R=8の3要素をこの順に全て追加し、その後3回取り出します。P・Q・Rは要素を区別するための練習用ラベルで、PとRは値が同じでも別の要素です。

確認するものスタック通常のキュー
1回目に取り出す要素R(値8)P(値8)
1回目の後に残る列[P=8, Q=3] 底→上[Q=3, R=8] 先頭→末尾
ラベルも付けた全出力R・Q・PP・Q・R
値だけの全出力8・3・88・3・8

出力値はどちらも8・3・8ですが、スタックが最初に取ったのはR、キューはPです。同じ値を持つ別の要素なので、ラベルと残った列を見れば操作の違いが分かります。

空のときの動作は問題ごとの定義に従う

元の10操作を終えた後に11回目の操作として取り出しを追加すると、どちらも既に空です。この教材の定義ではそこで停止し、新しい出力は増えません。

実際のプログラムでは、空のときの扱いは関数や問題文の仕様に従います。2025年度のIPA科目B公開問題の問3でも、戻り値や格納できる範囲などが個別に定義されています。空の状態で取り出そうとしたら停止するのは、この教材での決まりです。試験問題では、その問題に書かれた動作が優先されます。

操作後の状態を書き落とすときは、短いコードで実行した行と更新後の値を対応させる練習が役立ちます。

基本操作から配列や関数の実装へ進む

配列やポインタで実装する問題でも、スタックは最後に入れた要素、キューは最初に入れた要素を取り出す関係は同じです。保存場所の表し方が変わっても、今回の10操作を追う考え方が使えます。

IPAの基本情報シラバスVer.9.2は、スタックとキューの特徴・基本操作を学習範囲とし、FIFO・LIFO・プッシュ・ポップを挙げています。基本操作を追えるようになったら、公式問題でほかの処理と組み合わせた演習と時間配分の確認へ進みます。

取り出す側の違いが説明できれば、手元の教材で関数や配列の実装へ進めます。解説を読んでも初期状態や操作後の列を作れない場合は、基本情報技術者の通信講座比較で、データ構造・科目B演習と質問対応の範囲を比べられます。

根拠と教材の範囲

資料の確認日は2026年10月1日です。操作列と状態表は自作の練習用です。通常のスタックとキューの基本操作を扱い、優先度付きキューや循環配列の実装は別の学習範囲になります。

書いて整理したい方には、スタックとキューを混同しない|追加途中の取り出し順を比べる練習 回答用シート(PDF)も使えます。

目次