見出し画像

基本情報技術者試験対策【アルゴリズム第3回】配列・スタック・キューを完全理解|科目B頻出データ構造を図解で攻略

「スタックとキューって何が違うの?」「配列の添字でいつもミスする…」

データ構造はパターンを覚えれば必ず解ける分野です。スタック・キューの動きはシンプルで、コツさえつかめば得点源になります。

この記事では配列・スタック・キューを身近な例えで解説し、疑似言語での実装と試験頻出パターンまで丁寧に説明します。読み終わった後には「あ、これ知ってる」という感覚で問題を解けるようになります。

それでは知見を深めましょう。


この記事でわかること

  • 配列の基本操作と試験での使われ方

  • スタック(LIFO)の仕組み・PUSH/POPの動き

  • キュー(FIFO)の仕組み・エンキュー/デキューの動き

  • スタックとキューの疑似言語での実装方法

  • 試験で狙われる頻出パターンと解き方



1. データ構造とは何か

データ構造の定義

データ構造とは、データを効率よく管理・操作するための格納方法です。

「どうやってデータを並べて、どうやって取り出すか」のルールを定めたものです。

アルゴリズムがデータをどう処理するかの「手順」なら、データ構造はそのデータをどう「整理」するかです。

なぜデータ構造を理解する必要があるのか

試験の観点からいうと、科目Bのアルゴリズムとプログラミング分野には、再帰・スタック・キュー・木構造・グラフ・連結リスト・整列・文字列処理などが出題範囲として含まれています。

つまりデータ構造を知らないと、科目Bの問題の多くが解けない状態になります。

実務の観点でも、スタックはブラウザの「戻る」ボタン、キューはプリンターの印刷待ち行列など、日常的に使われています。理解すると身の回りのIT製品の仕組みが見えてきます。(仕組みが見えるとより面白くなる!)


2. 配列(Array)

配列の基本

配列は、同じ型のデータを連続した領域に並べたデータ構造です。

マンションの部屋番号のようなイメージです。部屋番号(添字)を指定すれば、どの部屋(要素)にも直接アクセスできます。

`a[3]` と指定すれば、3番目の要素 `8` を取り出せます。

配列の重要ルール(試験頻出)

基本情報の疑似言語では配列の添字は0から始まる場合と1から始まる場合があります。

整数型の配列: a ← {10, 25, 8, 42, 17}
・添え字が1から始まる場合
a[1] → 10 a[3] → 8 a[5] → 17
・添え字が0から始まる場合
a[0] → 10 a[1] → 25 a[3] → 42

添字が0から始まると思い込むと全部の値がずれます。
必ず問題文で確認する習慣をつけてください

配列の基本操作パターン

パターン①:全要素を順番に処理する

for (i を 1 から aの要素数 まで 1 ずつ増やす)
  aの各要素に対する処理
endfor

パターン②:最大値を求める

maxVal ← a[1]
for (i を 2 から aの要素数 まで 1 ずつ増やす)
  if (a[i] > maxVal)
    maxVal ← a[i]
  endif
endfor

パターン③:2つの要素を入れ替える(swap)

tmp ← a[i]
a[i] ← a[j]
a[j] ← tmp

tmpを使わず直接入れ替えようとすると上書きされてしまい元の値が消えます。
一時変数tmpは必須です。

二次元配列

行と列で管理するのが二次元配列です。表形式のデータを扱うときに使います。

整数型の配列: matrix[3][3]
matrix[行][列] の形式でアクセスする

`matrix[2][3]` は2行3列目の要素です。行が先・列が後の順番を覚えておきましょう。

2次元配列イメージ図

3. スタック(Stack)

スタックとは

スタックは、後から入れたものが先に出てくるデータ構造です。

LIFO(Last In, First Out):後入れ先出し、とも呼ばれます。

身近な例えで考えると、「食器棚に重ねたお皿」がまさにスタックです。

下から積んでいく:皿A → 皿B → 皿C
取り出すとき:皿C(一番上)から順番に取れる
最後に置いた皿Cが最初に取り出される

スタックの2大操作

スタックの動きを図で確認

初期状態(空)から3→1→4の順にPUSHし、2回POPした場合:

 PUSH(3) → [3] 
 PUSH(1) → [3, 1]
 PUSH(4) → [3, 1, 4] 
 POP → 4を取り出す → [3, 1]
 POP → 1を取り出す → [3]

最後に入れた4が最初に出てくる。これがLIFOです。

スタックの疑似言語実装

試験では配列を使ってスタックを実装するパターンが出題されます。

 整数型の配列: stack[100]
 整数型: top ← 0

 ○ push(value)
   top ← top + 1
   stack[top] ← value

 ○ pop()
   整数型: val ← stack[top]
   top ← top - 1
   return val

`top` はスタックのトップ位置を管理する変数です。PUSHするたびにtopが1増え、POPするたびに1減ります。

スタックのトレース練習

次の操作を順番に実行したとき、最後にPOPで取り出される値はいくらか。

push(5)
push(3)
push(8)
pop()← この値を答える
push(2)

最初のpopで取り出される値は 8 です。

スタックの活用場面

スタックは関数の呼び出し履歴の管理や、再帰処理、逆順処理などさまざまな場面で使用されます。テキストエディタや画像編集ソフトのUndo(元に戻す)機能は、ユーザーが行った操作をスタックに保存し、Undoを実行する際に最後の操作から順に取り消すことで実現しています。


4. キュー(Queue)

キューとは

キューは、先に入れたものが先に出てくるデータ構造です。

FIFO(First In, First Out):先入れ先出し、とも呼ばれます。

「コンビニのレジ待ちの行列」がまさにキューです。

先に並んだ人から順番に会計できる
最初に並んだ人が最初にレジに呼ばれる

キューの2大操作

キューの動きを図で確認

初期状態(空)から3→1→4の順にエンキューし、2回デキューした場合:

 enqueue(3) → [3]
 enqueue(1) → [3, 1]
 enqueue(4) → [3, 1, 4]

 dequeue → 3を取り出す → [1, 4]
 dequeue → 1を取り出す → [4]

最初に入れた3が最初に出てくる。これがFIFOです。

キューの疑似言語実装

 整数型の配列: queue[100]
 整数型: head ← 1
 整数型: tail ← 0

 ○ enqueue(value)
   tail ← tail + 1
   queue[tail] ← value

 ○ dequeue()
   整数型: val ← queue[head]
   head ← head + 1
   return val

`head` は先頭位置、`tail` は末尾位置を管理します。エンキューでtailが進み、デキューでheadが進みます。

キューのトレース練習

次の操作を順番に実行したとき、2回目のdequeueで取り出される値はいくらか。

enqueue(7)
enqueue(2)
enqueue(9)
dequeue()← 1回目
enqueue(4)
dequeue()← 2回目(この値を答える)

2回目のdequeueで取り出される値は 2 です。

キューの活用場面

キューは幅優先探索(BFS)やタスク管理などさまざまなアルゴリズムと結びついています。 プリンターの印刷待ち行列や、OSのプロセス管理など、「順番待ち」が必要なあらゆる場面で使われています。


5. スタックとキューの違いを完全整理

試験でも混乱しやすいポイントをまとめます。

混乱しないための覚え方

スタックは「積み上げた本」をイメージしてください。最後に置いた本が一番上にあり、最初に取れます。

キューは「列に並ぶ」をイメージしてください。先に並んだ人が先にサービスを受けられます。


6. 試験頻出パターン

パターン①:スタックで逆順に並べる

スタックにデータを全部PUSHしてから全部POPすると、順序が逆になります。

入力:1, 2, 3, 4, 5
PUSHを5回 → スタック:[1,2,3,4,5](5がトップ)
POPを5回 → 出力:5, 4, 3, 2, 1(逆順)

文字列の逆順処理やパリンドローム(回文)判定で頻出です。

パターン②:キューで順番通りに処理する

キューは「入力された順番で処理する」ときに使います。

タスク管理の例:
enqueue(タスクA) → enqueue(タスクB) → enqueue(タスクC)
dequeue → タスクA を処理
dequeue → タスクB を処理
dequeue → タスクC を処理

パターン③:スタックのオーバーフロー・アンダーフロー

スタックが満杯のときにPUSHしようとするとオーバーフロー(溢れ)、空のときにPOPしようとすると**アンダーフロー(空読み)**が発生します。

試験ではこれらのエラー処理を問う問題が出ます。

○ push(value)
  if (top ≧ スタックの最大サイズ)
    「オーバーフロー」を表示する
    return
  endif
  top ← top + 1
  stack[top] ← value

パターン④:スタックとキューの組み合わせ問題

操作の順番が混在する問題が出ます。「PUSHとPOPとENQUEUEとDEQUEUEが入り混じっているとき、最終状態はどうなるか」という形式です。

こういった問題は必ずトレース表を書いて、状態を1ステップずつ確認することが重要です。


まとめ

配列・スタック・キューは次回以降の探索・ソート・再帰の土台になります。「どのデータ構造が問題に使われているか」を見抜く力が科目B攻略のカギです。


関連記事


いいなと思ったら応援しよう!

kai@内勤がITやってるやつ よろしければ応援お願いします! いただいたチップはさらなる研鑽費に使わせていただきます!