テクノロジ系アルゴリズムとプログラミング出題頻度 ★★

データ構造(スタック・キュー)

データの並べ方・しまい方であるデータ構造を、積み重ねたお皿(スタック)とレジの行列(キュー)で図解。配列・リスト・木構造との違いや、プッシュ・ポップなどの操作をたどる問題が解けるようになります。

この単元の用語:データ構造 / 配列 / リスト / ポインタ / スタック / キュー / LIFO / FIFO / 木構造 / 2分木

「データ構造」って、データの形のことですか?

そう、データをどんな順番・どんなつながりでしまっておくかという「しまい方のルール」のことだよ。お皿の積み方とレジの並び方を思い浮かべると、いちばん大事なスタックとキューがすぐわかるよ。

データ構造は「しまい方のルール」

本棚に本を並べるとき、「番号順に並べる」「最近読んだものを手前に置く」など、しまい方によって 取り出しやすさ が変わります。プログラムでも同じで、目的に合ったしまい方を選ぶことで処理が速く、わかりやすくなります。この「しまい方」を データ構造 といいます。

配列:番号付きの箱が並んだもの

配列 は、同じ種類のデータを入れる箱を 一列に並べ、番号(要素番号、添字)を付けたもの です。ロッカーのように、番号を指定すれば どの箱にもすぐアクセスできる のが長所です。

一方、途中にデータを割り込ませると、後ろのデータを1つずつずらす必要があり、手間がかかります。

リスト:ポインタで数珠つなぎ

リスト(連結リスト) は、各データが 「次のデータの場所」を示す情報(ポインタ) を持ち、数珠つなぎになった構造です。宝探しの「次のヒントは○○にある」というメモをたどるイメージです。

途中に追加・削除するときは ポインタを付け替えるだけ で済み、データをずらす必要がありません。ただし、目的のデータにたどり着くには先頭から順にたどる必要があります。

スタック:後から入れたものが先に出る

スタック は、データを 上に積み重ね、上から取り出す 構造です。食器棚に積んだお皿を思い浮かべてください。最後に置いたお皿を最初に取りますよね。

  • 入れる操作:プッシュ(push)
  • 取り出す操作:ポップ(pop)
  • 性質:後入れ先出し(LIFO:Last In First Out)

キュー:先に入れたものが先に出る

キュー は、データを 後ろに並ばせ、前から取り出す 構造です。レジの行列と同じで、先に並んだ人から会計します。

  • 入れる操作:エンキュー(enqueue)
  • 取り出す操作:デキュー(dequeue)
  • 性質:先入れ先出し(FIFO:First In First Out)
スタック(LIFO) A(1番目) B(2番目) C(3番目) push pop → C キュー(FIFO) A B C enqueue(後ろに並ぶ) dequeue → A(先頭から出る) 先頭 末尾
A→B→Cの順に入れたとき、スタックからはC、キューからはAが最初に出てくる
  • スタック=お皿の山(stack は英語で「積み重ね」の意味)→ 最後に置いた皿から使う
  • キュー=行列(queue は英語で「行列に並ぶ」の意味)→ 先に並んだ人から

操作をたどってみよう

試験では、「この順に操作したら何が出てくるか」がよく問われます。中身を図に描きながら1手ずつ 進めるのが確実です。

入れる A 入れる B 入れる C 取り出す 入れる D スタック A A B A B C A B C出る A B D キュー A A B A B C B C A出る B C D キューは左が先頭(次に出る)、スタックは上が次に出る
同じ「A・B・Cを入れて1つ取り出し、Dを入れる」でも、出てくるデータと残る中身が違う

木構造:枝分かれするつながり

木構造 は、1つのデータ(根)から枝分かれしてデータがつながる構造です。パソコンのフォルダ(フォルダの中にフォルダ)や会社の組織図が身近な例です。

特に、各データから出る枝が最大2本 のものを 2分木 といいます。「左の枝には小さい値、右の枝には大きい値」というルールで並べた2分木を 2分探索木 といい、探索を効率よく行えます。

データ構造の比較

データ構造しまい方得意なこと身近な例・使われ方
配列番号付きの箱を一列に並べる番号を指定してすぐ読み書きロッカー、成績表
リストポインタで次をたどる途中への挿入・削除宝探しのヒントのメモ
スタック上に積んで上から取る(LIFO)直前の状態に戻る「戻る」ボタン、元に戻す(Undo)
キュー後ろに並んで前から出る(FIFO)来た順に処理する印刷の順番待ち、レジの行列
木構造根から枝分かれ階層の表現、効率的な探索フォルダ、組織図

スタックとキューの 取り出し口を逆に覚える ミスが多い。「スタック=最後に入れたものが出る」「キュー=最初に入れたものが出る」を、図を描いて確かめよう。

試験に出るポイント

  • スタック:後入れ先出し(LIFO)。push で積み、pop で上から取り出す
  • キュー:先入れ先出し(FIFO)。enqueue で後ろに並べ、dequeue で先頭から取り出す
  • 操作の問題は、中身を図に描きながら1手ずつたどる
  • 配列は番号で直接アクセスが得意、リストはポインタの付け替えで挿入・削除が得意
  • 木構造は階層を表す。枝が最大2本のものが2分木

確認クイズ

選択肢をタップすると、すぐに正解と解説が表示されます。

Q1空のスタックに対して、次の操作を順に行った。取り出されたデータを、取り出された順に並べたものはどれか。
push 1 → push 2 → pop → push 3 → push 4 → pop → pop

Q2空のキューに対して、次の操作を順に行った。最後にキューに残っているデータはどれか。
enqueue 1 → enqueue 2 → dequeue → enqueue 3 → enqueue 4 → dequeue → dequeue

Q3Webブラウザの「戻る」ボタンのように、直前に見たページから順にさかのぼる仕組みを実現するのに最も適したデータ構造はどれか。

Q4データ構造の「リスト」の説明として、適切なものはどれか。