データ構造をやさしく図解 — スタック・キュー・リスト・木構造
「スタックとキューって何が違うの?」「木構造の根・節・葉?」——データ構造は、データを"どう並べて・どう出し入れするか"のルールです。適切な構造を選ぶと、プログラムは速く・シンプルになります。この記事では、配列・スタック・キュー・連結リスト・木構造を、動きの図でやさしく整理します。アルゴリズムを動かすなら ソート可視化 や 探索可視化 もどうぞ。
データ構造とは — 出し入れのルールが違う「入れ物」
同じデータでも、「どんな入れ物に、どんな順で入れるか」で得意なことが変わります。先頭・末尾・途中のどこに素早くアクセスできるか、取り出す順番はどうなるか——この違いを理解して使い分けるのがポイントです。まずは基本の5つを見ていきます。
配列(Array)— 番号で一発アクセス
配列は、同じ種類のデータを連続した箱に並べ、添字(インデックス、0から始まる番号)で各要素を指定します。a[3] のように、何番目でも一発で読み書き(ランダムアクセス)できるのが最大の強み。一方、途中に要素を割り込ませたり削ったりするには、後ろの要素を全部ずらす必要があり、そこは苦手です。
スタック(Stack)— 後入れ先出し(LIFO)
スタックは、最後に入れたものから取り出す構造。積み重ねた本や皿のように、上に載せて(push)、上から取る(pop)。この性質をLIFO(Last In First Out:後入れ先出し)と呼びます。
使いどころ: エディタ・ブラウザの「元に戻す(Undo)」、関数の呼び出し履歴(コールスタック)、括弧の対応チェックなど。「最後にしたことを最初に取り消す」場面で活躍します。
キュー(Queue)— 先入れ先出し(FIFO)
キューは、先に入れたものから取り出す構造。レジの行列と同じで、後ろに並び(enqueue)、先頭から抜けていく(dequeue)。この性質をFIFO(First In First Out:先入れ先出し)と呼びます。
使いどころ: プリンタの印刷待ち、OSのタスク処理待ち、Webサーバーのリクエスト処理など。「来た順に公平にさばく」場面で使われます。TCPのデータ送受信バッファなどにも通じる考え方です。
連結リスト(Linked List)— つなぎ替えで挿入が速い
連結リストは、各要素(ノード)が「値」と「次の要素の位置(ポインタ)」を持ち、数珠つなぎになった構造です。途中への挿入・削除がポインタのつなぎ替えだけで済むのが強み。一方、n番目の要素を得るには先頭からたどる必要があり、配列のような一発アクセスはできません。
木構造(Tree)— 階層を表す
木構造は、データの階層関係・親子関係を表します。一番上の出発点を根(ルート)、枝分かれの各点を節(ノード)、末端を葉(リーフ)と呼びます。各節が持つ子が最大2つの木を二分木といい、探索やソートの土台になります。
この図のように「左の子 < 親 < 右の子」を保った二分木を二分探索木といい、大小をたどるだけで目的の値へ効率よく到達できます。この「半分ずつ絞る」考え方は 二分探索の可視化 と同じです。木構造は、ファイルシステム(フォルダの入れ子)やHTMLのDOM、組織図などにも現れます。
使い分けのまとめ
| 構造 | 取り出し順 | 得意 | 苦手 |
|---|---|---|---|
| 配列 | 添字で自由 | n番目への一発アクセス | 途中の挿入・削除 |
| スタック | 後入れ先出し(LIFO) | 直近を取り消す・戻す | 途中の参照 |
| キュー | 先入れ先出し(FIFO) | 来た順に公平処理 | 途中の参照 |
| 連結リスト | 先頭からたどる | 途中の挿入・削除 | n番目への一発アクセス |
| 木構造 | たどり方による | 階層表現・探索 | 実装がやや複雑 |
🖥️ 手を動かして理解するなら:データ構造の上で動くアルゴリズムを、ソートアルゴリズム可視化(配列の並べ替え)や探索アルゴリズム可視化(二分探索の絞り込み)で、フローチャート付きで1手ずつ追えます。擬似言語での配列操作は擬似言語ステッパーで変数の変化を見ながら試せます。
基本情報技術者試験ではこう出る
「LIFOはスタックかキューか」「FIFOで正しく取り出される順序は」「連結リストと配列で挿入・アクセスのコストを比較」「木構造の根・節・葉・深さ」などが定番です。とくにスタック=LIFO、キュー=FIFO の対応は必ず覚えましょう。科目Bの擬似言語問題でも、配列やスタックを操作するトレースが頻出です。アルゴリズムの計算量は 探索の可視化 で O(n) と O(log n) を体感すると腹落ちします。
よくある質問
Q. 逆ポーランド記法(後置記法)はなぜスタックで計算できるの?
A. 数値を見たらスタックに積み、演算子を見たら上から2つ取り出して計算し、結果をまた積む——という手順で、括弧なしで正しく計算できるからです。「最後に積んだ2つを使う」というLIFOの性質がぴったり合います。
Q. 双方向リスト・循環リストとは?
A. 双方向リストは各ノードが「次」だけでなく「前」も指すもので、前後どちらにもたどれます。循環リストは末尾が先頭に戻る形で、ぐるぐる回して処理する用途に向きます。いずれも連結リストの応用です。
Q. ハッシュ表(連想配列)もデータ構造?
A. はい。キーを計算(ハッシュ)して格納場所を直接求めることで、平均的にとても速く検索・追加できる構造です。キーと値のペアを扱うときに使われます。ハッシュの考え方は当サイトのハッシュ生成ツールでも触れられます。
まとめ
データ構造は「出し入れのルールが違う入れ物」。配列=番号で一発、スタック=LIFO、キュー=FIFO、連結リスト=つなぎ替えで挿入が速い、木=階層と探索。それぞれの得意・不得意を押さえれば、問題に合った構造を選べるようになります。理屈を覚えたら、可視化で実際の動きを見て定着させましょう。
関連ページ: ソートアルゴリズム可視化 / 探索アルゴリズム可視化 / 擬似言語ステッパー / 擬似言語の読み方 / 記事一覧