基本情報のスタックとキュー|科目Bで出るデータ構造を図解

基本情報のスタックとキューを学ぶためのデータ構造イメージ

基本情報のスタックとキューは、用語だけ見ると簡単そうなのに、問題になると急に手が止まりやすい分野です。LIFO、FIFO、push、pop、enq、deqという言葉を覚えていても、複数の操作が混ざると「今どのデータが残っているのか」が見えにくくなります。

特に科目Bでは、データ構造の名前を答えるだけではなく、擬似言語や手続きの流れを読んで、最終的に取り出される値を追う力が必要です。この記事では、基本情報のスタックとキューを、暗記ではなく手順で解けるように整理します。

この記事のポイント
  • スタックは後入れ先出し、キューは先入れ先出しで区別する
  • push・pop・enq・deqは操作後の状態まで書く
  • 混在問題はスタック欄とキュー欄を分けて追う
  • 科目Bでは目的と条件を読んでから表にする
無料

基本情報技術者試験 過去問アプリ

本番形式で繰り返し解ける。スキマ時間に1問から

2,000問以上収録
無料で過去問を解く
目次

基本情報のスタックとキューの基礎

スタックとキューの違いをカードで比較する学習イメージ

LIFOとFIFOを先に押さえる

基本情報のスタックとキューで最初に押さえるべきなのは、名前そのものよりも「どちら側から取り出すか」です。スタックは最後に入れたものを最初に取り出す構造で、英語ではLIFO、Last In First Outと表します。キューは最初に入れたものを最初に取り出す構造で、FIFO、First In First Outと表します。この2つを日本語で丸暗記するだけだと、問題文で操作が続いたときに混ざりやすいです。

イメージとしては、スタックは机の上に積んだカードです。上からカードを置き、取り出すときも上から取ります。途中のカードだけを抜く前提ではないので、最後に置いたカードが最初に出ます。キューは受付の列です。後から来た人は後ろに並び、先に並んだ人から順番に進みます。基本情報の問題では、身近な例のまま考えるより、操作のたびに「入口」と「出口」が同じか違うかを見ると安定します。

構造取り出し順覚え方よく出る操作
スタック最後に入れたものから出る積んだカードを上から取るpush / pop
キュー最初に入れたものから出る列に並んだ順に進むenq / deq

ここで大事なのは、LIFOとFIFOを対義語のように覚えることです。LIFOは最後が先、FIFOは最初が先。この対応だけを紙の端に書いてから問題を解くと、用語で迷う時間がかなり減ります。さらに、スタックとキューは単体で出るだけではなく、配列、リスト、再帰、探索などの説明にも混ざります。関連する基礎を確認したい場合は、基本情報の配列・リスト・ポインタの解説も合わせて見ておくと、データ構造全体のつながりが見えやすいです。

迷ったら「入れた順に出るか、逆順に出るか」だけを先に判定します。名前を思い出すより、取り出し順を追う方が点につながります。

スタックは最後から取り出す

スタックは、データを積み上げる構造です。基本情報では「後入れ先出し」「LIFO」「push」「pop」とセットで出ます。pushはスタックに入れる操作、popはスタックから取り出す操作です。A、B、Cの順にpushしたなら、スタックの下からA、B、Cの順に積まれます。ここでpopを実行すると、取り出されるのは最後に入れたCです。次にもう一度popするとB、その次はAになります。

スタックでありがちなミスは、入力順のまま取り出してしまうことです。問題文に「push(A)、push(B)、push(C)、X←pop()」と書かれていると、最初のAに目が行きますが、実際にXへ入るのはCです。スタックの問題では、データの並びを横に書くより、縦に書く方が間違いにくいです。紙に上からC、B、Aと書き、popのたびに一番上を消すだけで、頭の中で入れ替える必要がなくなります。

  • pushは上に積む
  • popは一番上から取る
  • 最後にpushした値が最初のpopで出る
  • 途中の値を飛ばして取り出すとは考えない

科目Bでは、スタックが再帰処理や関数呼び出しの説明に関係することもあります。たとえば、ある処理の途中で別の処理を呼び出し、終わったら元の場所へ戻る流れは、最後に呼び出したものから戻るという点でスタックと相性がよいです。もちろん試験でそこまで実装の細部を問われるとは限りませんが、「後から積んだ作業を先に片付ける」と考えられると、抽象的な説明も読みやすくなります。

スタックは「積む」「戻る」「直前の状態を取り出す」という文脈で出やすいです。問題文に直前・最後・戻るというニュアンスがあれば、スタックを疑うとよいですね。

キューは先頭から取り出す

キューは、データを列として扱う構造です。基本情報では「先入れ先出し」「FIFO」「enq」「deq」とセットで覚えます。enqはキューに入れる操作、deqはキューから取り出す操作です。A、B、Cの順にenqしたなら、キューの先頭はA、次がB、最後尾がCです。deqを実行すると、最初に入ったAが取り出されます。次のdeqではB、その次はCです。

キューのポイントは、入口と出口が違うことです。スタックは同じ場所から入れて同じ場所から取るイメージですが、キューは列の後ろに追加して、列の前から取り出します。そのため、キューの状態を書くときは、左を先頭、右を最後尾と決めておくと楽です。enqしたら右に追加し、deqしたら左を消す。これだけで、FIFOという英語を思い出さなくても操作を追えます。

enqはenqueueの略として扱われ、列に入れる操作です。deqはdequeueの略として扱われ、列から取り出す操作です。表記は教材によって少し変わりますが、基本情報では「キューに入れる」「キューから取り出す」という意味で読めれば十分です。

現実の例では、プリンタの印刷待ち、受付順の処理、メッセージの順番処理などがキューに近いです。先に来た要求を先に処理するので、公平な順番待ちに向いています。試験問題では「先頭」「末尾」「到着順」「受付順」といった言葉がヒントになります。キューをスタックと混同してしまう人は、問題を解く前に左端へ「先頭」、右端へ「末尾」と小さく書いておくと、取り出す側を取り違えにくくなります。

  • 順番待ちの処理を表しやすい
  • 先に入ったデータを優先できる
  • 状態を横並びに書くと追いやすい

pushとpopを見分ける

pushとpopはスタックの操作です。基本情報の問題文では、push(A)のように括弧付きで書かれることもあれば、「Aをスタックに挿入する」「スタックから取り出す」のように日本語で説明されることもあります。pushは入れる、popは出す。この対応は短いですが、問題を解くときは「操作名を読んだ瞬間に状態を更新する」ことが大切です。あとでまとめて処理しようとすると、途中の状態を忘れやすくなります。

たとえば、push(A)、push(B)、pop()、push(C)、pop()という流れを考えます。最初にAを積み、次にBを積みます。最初のpopではBが出るので、スタックにはAだけが残ります。その後Cを積むと、上からC、Aです。次のpopで出るのはCです。このように、popで何が出たかだけでなく、残ったスタックの中身も毎回書く必要があります。最終値だけを追うと、途中で別の構造へ渡される問題に対応できません。

操作取り出される値スタックの状態
push(A)なしA
push(B)なしB, A
pop()BA
push(C)なしC, A
pop()CA

表では、スタックの状態を上から順に「B, A」のように書いています。自分の中でルールが決まっていれば、下から順に書いても構いません。ただし、途中で書き方を変えるのは危険です。上から書くなら常に上から、左を上と決めるなら常に左を上にします。基本情報のスタック問題は、難しい計算ではなく、表記ルールのぶれで落としやすい問題です。自分が見ても一瞬で取り出し位置がわかる書き方を固定しましょう。

pop()した値を消し忘れると、次のpopで同じ値をもう一度使ってしまいます。操作後の状態まで書いてから次に進むのが安全です。

enqとdeqを見分ける

enqとdeqはキューの操作です。enq(A)ならAをキューの末尾に入れ、deq()ならキューの先頭から取り出します。スタックのpush/popと同じように、操作名だけを覚えるのではなく、操作後のキューの状態を書き換える練習が必要です。A、B、Cを順にenqしたら、キューは先頭からA、B、Cです。deqするとAが出て、残りはB、Cになります。

キューでよくあるミスは、末尾から取り出してしまうことです。横に並べたとき、右側に新しいデータが追加されるため、つい右端を取りたくなります。しかしキューでは、取り出すのは先頭です。左を先頭、右を末尾と決めたなら、deqでは左端を消します。ここを徹底するだけで、スタックとの混同はかなり減ります。逆に、左右の意味を決めずに書くと、見た目だけで判断して間違えやすくなります。

キューの表は「左が先頭、右が末尾」と書き始めるのがおすすめです。deqは左を消す、enqは右に足す、と機械的に処理できます。

たとえば、enq(A)、enq(B)、deq()、enq(C)、deq()なら、最初にA、Bが並びます。最初のdeqでAが出て、Bだけが残ります。次にCを追加するとB、Cです。次のdeqで出るのはBです。スタックなら最後に入れたCが出そうですが、キューでは先に残っていたBが出ます。この差を体で覚えるには、同じデータ列でスタックとキューの両方を試すのが効果的です。

  • enqは末尾に追加する
  • deqは先頭から取り出す
  • 横並びにして先頭と末尾を固定する
  • 新しい値ほど後ろに並ぶと考える

基本情報のスタックとキューでは、操作名だけでなく、似た言葉の整理も大切です。「挿入」「追加」「格納」は、文脈によってpushやenqに対応します。「削除」「取出し」「取り出す」は、popやdeqに対応します。ただし、どの構造に対して操作しているかを見ないと判断できません。同じ「取り出す」でも、スタックからならpop、キューからならdeqです。言葉だけを見て反射的に決めないようにしましょう。

また、LIFOとFIFOの英字も混ざりやすいです。LIFOはLastが先に出る、FIFOはFirstが先に出ると見ると、略語の意味から判断できます。LastやFirstという単語に注目すると、スタックとキューの日本語訳を忘れても復元できます。試験中に焦ったときは、LIFOを「最後が先」、FIFOを「最初が先」と小さく書くのも有効です。英語を丸ごと覚えるより、出る順番だけを短く変換する方が速いです。

言葉対応しやすい操作見るべき点
挿入・追加・格納push / enq対象がスタックかキューか
取出し・削除pop / deq上から取るか先頭から取るか
後入れ先出しスタック最後に入れた値
先入れ先出しキュー最初に入れた値

この整理ができると、問題文の表記が少し変わっても対応できます。教材によっては、enqueue/dequeue、insert/remove、push/popなど、表記が揺れることがあります。基本情報では、記号そのものを知っているかより、説明を読んでデータの入出力を追えるかが重要です。知らない操作名が出ても、問題文の定義部分に「何をする操作か」が書かれていることが多いので、最初の条件文を飛ばさないようにしてください。

操作名が不安なときは、問題文の定義欄に戻ります。試験問題は、pushやenqの意味を本文中で説明してくれることが多いです。

基本情報のスタックとキューの解き方

スタックとキューの操作をトレースする学習イメージ

表を作って順に追う

基本情報のスタックとキューを解くときは、頭の中だけで処理しない方が安全です。操作が3つくらいなら暗算でも追えますが、5つ、6つと続くと、どの値が残っているのか曖昧になります。おすすめは、操作、取り出された値、スタックの状態、キューの状態を横に並べた表を作ることです。問題文にスタックだけが出るならキュー欄は不要ですが、混在問題では必ず分けて書きます。

スタックとキューの手順を手元で練習するイメージ

表を作るときは、1行に1操作だけを書きます。push(A)とpush(B)を同じ行にまとめると、途中でpopやdeqが入った場合に崩れます。操作を読んだら、その操作だけを処理し、状態を書き換えてから次の行に進みます。取り出された値が別の構造へ入る場合も、いったん「取り出された値」欄に書くと見落としにくいです。たとえば、enq(pop())なら、まずpopで出た値を確認し、その値をenqします。

手順操作出た値スタックキュー
開始なしなし
push(A)なしA
push(B)なしB, A
enq(pop())BAB

表を作る練習は、科目Bのトレース問題にもそのまま役立ちます。擬似言語では変数、配列、条件分岐、繰返しが一緒に出るため、状態を書いて追う習慣がないと読み落としが増えます。スタックとキューは、表の効果がわかりやすい題材です。まだトレースの書き方が不安な場合は、基本情報のトレース表の書き方で、変数や配列の追い方も確認しておくとよいです。

操作を読んだらすぐに状態欄を書き換える。これを徹底すると、スタックとキューの問題はかなり機械的に処理できます。

混在問題は移動を分ける

スタックとキューが同じ問題に出ると、難しく感じやすいです。理由は、データが一方から取り出され、もう一方へ移動するからです。たとえば、enq(pop())という操作では、スタックから値を取り出して、その値をキューへ入れます。ここで一気に処理しようとすると、どの値を取り出したのか、どちらの構造に残っているのかが曖昧になります。混在問題では、操作を小さく分けることが最重要です。

enq(pop())なら、まずpop()だけを考えます。スタックの一番上を取り出し、その値をメモします。次に、その値をキューの末尾へ追加します。push(deq())なら、まずdeq()でキューの先頭を取り出します。その値をスタックの上へpushします。関数の内側から処理するという考え方ですが、難しく考えすぎなくて大丈夫です。「取り出す操作を先に済ませ、出た値を入れる操作に使う」と見ると安定します。

STEP
内側の取り出しを見る

pop()またはdeq()で何が出るかを先に決めます。

STEP
出た値を一度メモする

取り出された値を表の「出た値」欄へ書きます。

STEP
外側の入れる操作を行う

その値をpushまたはenqで指定された構造へ入れます。

この分解をすると、混在問題でもやることは単純になります。スタックとキューを同時に考えるのではなく、1回の操作ごとに「どこから出たか」「どこへ入ったか」を確認するだけです。基本情報の科目Bでは、処理が長くなるほど焦りやすいですが、長い処理も短い処理の連続です。見た目で難しいと判断せず、内側の操作から順に表へ落とし込みましょう。

括弧がある操作は、内側で値を作ってから外側へ渡すと考えます。数学の計算順序に近い感覚で追うと読みやすいです。

空の状態を必ず確認する

スタックとキューの問題では、空の状態も重要です。基本的な問題では、空のスタックからpopしたり、空のキューからdeqしたりする場面は避けられていることが多いですが、科目Bの擬似言語では「空なら処理しない」「要素数が0より大きい間だけ繰り返す」といった条件が出ることがあります。この条件を読み飛ばすと、存在しない値を取り出したつもりで表を進めてしまいます。

空を確認するには、状態欄に「空」と書くのが一番わかりやすいです。何も書かない空欄にすると、書き忘れなのか本当に空なのかが後から判断できません。スタックが空なら「空」、キューが空なら「空」と明示します。問題を解いている途中で、取り出し操作の前に対象が空になっていないかを一瞬見るだけで、条件分岐の読み落としに気づけます。

空欄はミスのもとです。何も入っていない状態は「空」と書き、単なる書き忘れと区別できるようにしましょう。

また、要素数を別に数える問題もあります。たとえば、スタックに何個残っているか、キューに何個並んでいるかを条件にして処理する場合です。このときは、状態欄だけでなく個数欄を作ると安全です。pushやenqなら個数が1増え、popやdeqなら1減ります。最終的に取り出される値を問う問題でも、個数の条件が途中にあるなら、値と個数を同時に追う必要があります。

  • 空欄ではなく「空」と書く
  • 取り出し前に対象の状態を見る
  • 要素数条件があれば個数欄を作る
  • 条件分岐の直前で表を止めて確認する

科目Bでは処理目的も読む

基本情報のスタックとキューは、用語問題としてだけでなく、科目Bの処理読解にも関係します。科目Bでは、データ構造の名前を覚えているかより、処理の目的を読めているかが問われやすいです。たとえば、あるデータを一時的に退避するためにスタックを使うのか、到着順に処理するためにキューを使うのかで、プログラム全体の意味が変わります。操作だけを追っていると、条件分岐や繰返しの意図を見失います。

先に処理目的を読むと、表の作り方も決めやすくなります。最終的な出力を問われているなら、取り出された値を丁寧に追います。構造の中身を問われているなら、操作後の状態欄を重視します。何回処理されるかを問われているなら、要素数や繰返し回数も書きます。基本情報の科目Bは、同じ擬似言語でも問われ方によって注目点が変わるので、設問文を先に読む癖をつけるとよいです。

IPAのシラバスでも、データ構造の考え方や代表的なデータ構造の特徴を理解し、適用することが範囲として示されています。スタックとキューについても、特徴と基本操作が対象です。最新の位置づけを確認したい場合は、IPAのシラバス公開ページを見ておくと安心です。範囲を見たうえで、問題演習では「覚えた用語を使って処理を追う」練習に時間を使いましょう。

科目Bでは、操作名の暗記だけでは足りません。設問が「値」「状態」「回数」のどれを聞いているのかを先に確認しましょう。

科目Bが苦手なら

アルゴリズムや擬似言語は、読むだけでなく手を動かして解く量が大切です。科目Bに絞って対策したい人向けです。

科目B対策本を見る →

スタックとキューの練習は、長い問題から始めるより、短い操作列を何度も解く方が効率的です。最初から科目Bの長い擬似言語を読むと、データ構造以外の条件分岐や変数で迷ってしまいます。まずは、push、pop、enq、deqだけで構成された5操作前後の問題を解き、状態表を書く感覚を固めます。その後で、配列や繰返しが混ざる問題へ進むと、負担が少なくなります。

練習するときは、正解したかどうかだけでなく、どこで表が崩れたかを見直します。スタックの上と下を逆に書いたのか、キューの先頭と末尾を取り違えたのか、popした値を消し忘れたのか。ミスの種類がわかれば、次の問題で見るポイントが決まります。基本情報のデータ構造は、知識量よりも手順の安定性で差が出ます。解説を読んで納得するだけでなく、自分の手で表を書き直すことが大切です。

  • 最初は5操作前後の短問で練習する
  • 正解よりも表の書き方を確認する
  • 同じ操作列をスタック版とキュー版で比べる
  • 慣れたら擬似言語や配列問題へ進む

過去問演習に入る前に、関連するアルゴリズム全体の位置づけも確認しておくと理解がつながります。スタックとキューはデータ構造の一部ですが、科目Bではトレース、配列、探索、再帰などとセットで読まれます。全体像を見直したい場合は、基本情報のアルゴリズム対策も参考になります。苦手な人ほど、いきなり難問を解くより、短い操作を正確に追うところから始めるのがおすすめです。

練習の目的は、スタックとキューを覚えることではなく、操作後の状態を迷わず書けるようにすることです。

まとめ

基本情報のスタックとキューは、暗記だけで乗り切ろうとすると混乱しやすいですが、取り出し順と表の書き方を決めれば解きやすい分野です。スタックは最後に入れたものから取り出すLIFO、キューは最初に入れたものから取り出すFIFOです。pushとpopはスタック、enqとdeqはキューの操作として押さえ、操作のたびに状態を書き換えていきます。

特に混在問題では、スタックとキューを頭の中で同時に動かそうとしないことが大切です。表を作り、スタック欄とキュー欄を分け、取り出された値を一度メモしてから次の構造へ入れます。enq(pop())やpush(deq())のような操作も、内側の取り出しと外側の追加に分ければ、やっていることは単純です。長い問題ほど、この分解が効いてきます。

解くときの最終チェック
  • スタックは最後に入れた値を取り出しているか
  • キューは先頭の値を取り出しているか
  • popやdeqの後に状態を更新しているか
  • 設問が値・状態・回数のどれを聞いているか

最初は時間がかかっても構いません。表を書く手順が安定すると、スタックとキューは得点源にしやすくなります。科目Bの長い問題でも、結局は一つずつ状態を更新するだけです。LIFOとFIFOを短く確認し、操作名を見て、表に落とす。この流れを練習しておくと、本番でも落ち着いて処理を追えるようになります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次