データ構造(配列・リスト・スタック・キュー・木構造)|出し入れの順と根・節・葉【ITパスポート】

ITパスポート試験

ITパスポート 現行の範囲 テクノロジ系g36 データ構造最終更新 2026-10-20

データ構造は、たくさんのデータをどんな形に並べ、どの順で出し入れするかの決め方で、処理の手順(アルゴリズム)はこの形を前提に組み立てます。

データの型と、配列・レコード・ファイル

プログラムは、値を変数に入れて扱います。変数は、名前を付けた値の入れ物です。 入れてよい値の種類を型(タイプ)といい、整数だけを入れる整数型、小数も入れられる実数型、文字を入れる文字型、真か偽かを入れる論理型などがあります。 表の1つの項目(フィールド)にも、同じように型を決めます。点数のフィールドは整数、氏名のフィールドは文字、のようにです。 型を決めておくと、点数の欄に文字が入る、といった誤りを防げます。

値が1つなら変数1つで足りますが、40人分の点数を40個の変数で持つのは不便です。そこで使うのが次の3つの形です。

配列・レコード・ファイルの比べ。配列=4つの箱が横に並び、上に要素番号1・2・3・4、中に72・85・64・90。同じ型の値を番号で並べる。レコード=社員番号・氏名・入社日の3つの項目に、S01・青木・2024/4/1 が入った1枚のカード。型の違う項目をまとめて1件にする。ファイル=同じ形のレコードのカードが3枚重なったもの。レコードを集めたもの。

配列は同じ型を番号で並べ、レコードは型の違う項目を1件にまとめます。

配列 … 同じ型の値を並べ、1つの名前と要素番号で扱う。例:40人の点数を「点数の1番目」「点数の2番目」…と番号で呼ぶ

レコード … 1件分の、型の違う項目をまとめたもの。例:社員番号・氏名・入社日で社員1人分

ファイル … 同じ形のレコードを集めたもの。例:全社員分のレコード

配列とレコードの違いは、並べる値の型がそろっているかどうかです。 同じ型の値を番号で並べるのが配列、型の違う項目を1件分まとめるのがレコードです。 表にたとえると、レコードが横の1行、ファイルが表全体にあたります(関係データベースの表・レコード・フィールドは 17-1 データベース方式)。 配列は番号を2つ使って、行と列の表のように並べることもできます。これを2次元配列といいます。

配列の強みは、番号が分かればその場所をすぐ取り出せることです。 一方で、値が詰めて並んでいるので、途中に1つ入れるには、そこから後ろの値をすべて1つずつ後ろへずらす必要があります。 1,000個並んだ配列の先頭に1つ入れると、1,000個を動かすことになります。この弱点を補うのが次のリストです。

リスト ── 次を指す情報でつなぐ

リストは、データの1つ1つに次のデータがどこにあるかという情報を持たせ、それをたどって順につなぐ形です。 次を指すこの情報をポインタといいます。最後のデータには「次は無い」という印を入れておきます。

リストに1件を挿入する。挿入する前=A→B→D とつながり、D の次は「終わり」。挿入した後=A→B→C→D とつながり、D の次は「終わり」。変わったのは B から C への矢印と C から D への矢印の2本だけ。書き換えるのは次を指す情報だけで、ほかのデータは動かさない。各データの右側にある次を指す情報がポインタ。

C を入れるときに書き換えるのは、B の次を指す情報と、C の次を指す情報の2つだけです。

A→B→D とつながったリストの B と D のあいだに C を入れるときは、C をどこか空いた場所に置き、 B のポインタを C に向け、C のポインタを D に向けるだけです。A や D は1つも動きません。 削除も同じで、B を外したければ、A のポインタを B の次の C に向け直せば、たどる道から B が消えます。

その代わり、リストは「先頭から5番目」をすぐには取り出せません。ポインタを先頭から順にたどるしかないからです。 途中への挿入や削除が多ければリスト、番号ですぐ取り出したければ配列、と向きが分かれます。 なお、次だけでなく前のデータを指すポインタも持たせると、どちらの向きにもたどれます。これを双方向リストといいます。

スタックとキュー ── 取り出す順番の決まり

データを1つずつ入れて、1つずつ取り出す入れ物を考えます。取り出す順番の決め方で、2つの形に分かれます。

スタックとキュー。スタック=上だけが開いた縦長の入れ物に、下から A・B・C が積まれている。入れるのも取り出すのも上の口から。後に入れたものを先に取り出す、後入れ先出し(LIFO)。キュー=両端が開いた横長の筒に、左から A・B・C が並ぶ。右の端から入れて、左の端から取り出す。先に入れたものを先に取り出す、先入れ先出し(FIFO)。

スタックは入口と出口が同じ、キューは入口と出口が反対側にあります。

スタック … 最後に入れたものから取り出す。後入れ先出し(LIFO:Last In First Out)。入れることをプッシュ、取り出すことをポップという。例:Web ブラウザーの「戻る」、編集の「元に戻す」

キュー … 最初に入れたものから取り出す。先入れ先出し(FIFO:First In First Out)。待ち行列ともいう。例:プリンターの印刷の順番待ち、レジの行列

スタックは、皿を上へ積み重ねるのと同じで、取れるのはいちばん上の皿だけです。 Web ブラウザーは、開いたページを順にスタックへ積み、「戻る」を押すたびにいちばん上を取り出すので、直前に見たページからさかのぼれます。 キューは店の行列と同じで、先に並んだ人から呼ばれます。

出し入れが続くときは、頭の中だけで追わず、1回の操作ごとに中身を書き出します。 空の入れ物に A、B、C を順に入れ、1つ取り出し、D を入れ、また1つ取り出す、という同じ操作を、両方で追ってみます。

スタック(中身は下から上の順に書く)
A を入れる → A
B を入れる → A、B
C を入れる → A、B、C
取り出す → C が出る。残り A、B
D を入れる → A、B、D
取り出す → D が出る。残り A、B
キュー(中身は先頭から順に書く)
A を入れる → A
B を入れる → A、B
C を入れる → A、B、C
取り出す → A が出る。残り B、C
D を入れる → B、C、D
取り出す → B が出る。残り C、D

同じ操作でも、スタックは C、D の順、キューは A、B の順に出てきます。

スタックはいちばん新しいもの、キューはいちばん古いものが、次に出てきます。 取り出す前に「いま残っている中で、いちばん新しいのはどれか(スタック)」「いちばん古いのはどれか(キュー)」と考えれば、迷いません。

空のスタックに、A、B、C の順にデータを入れました。次に1つ取り出し、D を入れ、そのあと2つ続けて取り出しました。最後に取り出したデータはどれですか。

木構造と2分木

木構造は、1つのデータから枝分かれして、下へ広がっていく階層の形です。木を逆さにした形で、上から下へ描きます。 会社の組織図(社長の下に部、部の下に課)や、パソコンのフォルダの階層がこの形です。

木構造の各部の名前。いちばん上の丸が根。根から2本の枝が下の2つの丸に分かれる。左の丸はさらに2つの丸に枝分かれしているので節。右の丸は下に何も無いので葉。左の丸の下の2つも葉。根と左の丸の関係では、上が親、下が子。凡例:根=いちばん上の1つ、節=下に枝が続く途中の点、葉=下に何も無い末端。

下に枝が続くかどうかで、節か葉かが決まります。

根(ルート) … いちばん上の1つ。ここからすべてが枝分かれする

節(ノード) … 下に枝が続いている途中の点

葉(リーフ) … 下に何もつながっていない末端

親と子 … 枝でつながった2つのうち、上が親、下が子。根以外には親が1つだけある

たとえば、社長の下に営業部があり、営業部の下に第1課と第2課がある組織図なら、根は社長です。 営業部は下に第1課と第2課が続くので節、第1課と第2課は下に何もつながっていないので葉です。 節か葉かは、名前や種類ではなく、その下に枝が続いているかどうかで決まります。

パソコンのフォルダ(ディレクトリ)とファイルの階層も、同じ決め方で読めます。手がかりになる事実は2つです。 ファイルの中には、別のファイルやフォルダを入れられません。フォルダは、中に何かを入れることも、空のまま置いておくこともできます。 この2つに「下に枝が続くかどうか」を当てはめれば、節になりうるもの、葉になりうるものが決まります (ファイルとディレクトリの仕組みは 14-3 コンピュータの構成要素)。

どの節も子を2つまでしか持たない木を2分木といいます。子は「左の子」「右の子」と区別します。 よく使われるのが、どの節でも左の子から下には自分より小さい値、右の子から下には自分より大きい値だけを置くという決まりを付けた2分木で、 値を探すときに根から比べて左か右へ進めば、見なくてよい枝を丸ごと飛ばせます。

2分木(子は2つまで)。根は50。50の左の子は30、右の子は70。30の左の子は20、右の子は40。70の子は右の80だけ。どの節でも、左の子から下には自分より小さい値、右の子から下には大きい値だけが入っている。40を探すときは、50と比べて小さいので左へ、30と比べて大きいので右へ進み、40に着く。

根から順に比べて左か右へ進むので、6つのうち3つを見るだけで40に着きます。

上の2分木で 40 を探す
根の 50 と比べる → 40 は小さい → 左の子へ
30 と比べる → 40 は大きい → 右の子へ
40 と比べる → 一致。見つかった(比べたのは3回)

50 の右側にある 70 と 80 は、一度も見ていません。

ある会社の組織図は、社長の下に営業部と開発部があり、営業部の下に第1課と第2課があります。開発部の下に課はありません。この組織図を木構造と見たとき、葉にあたるものをすべて挙げたのはどれですか。

まとめ

この回で持ち帰ること

1. 変数やフィールドには、入れてよい値の種類(型)を決める。配列=同じ型を要素番号で並べる、レコード=型の違う項目を1件分まとめる、ファイル=レコードの集まり

2. 配列は番号ですぐ取り出せるが、途中への挿入・削除では後ろをずらす。リストはポインタ(次を指す情報)でつなぎ、挿入・削除はポインタの書き換えで済む

3. スタック=後入れ先出し(LIFO。プッシュ/ポップ)。キュー=先入れ先出し(FIFO。待ち行列)。出し入れは1回ごとに中身を書き出して追う

4. 木構造は根・節・葉・親・子で表す。下に続くものがあれば節、無ければ葉。名前や種類では決まらない

5. 2分木=どの節も子が2つまで。左側に小さい値・右側に大きい値を置くと、根から比べて左右へ進むだけで探せる

この節で解ける公開問題

令和4〜8年度の公開問題のうち、この節の知識が決め手になる問題は次の1問です。

同じ分野の過去問を続けて解く(アルゴリズムとプログラミング 17問) →

教科書の一覧(現行の試験の順)教科書の一覧(新しい試験の順)過去問

ITパスポートのUdemy講座を口コミで比べる。動画講座3つ・問題集3つ、受講者数・★評価・口コミつき。広告を含むページですITパスポートのUdemy講座を口コミで比べる。動画講座3つ・問題集3つ、受講者数・★評価・口コミつき。広告を含むページです

Udemy の ITパスポート講座を、受講者数・★評価・口コミで比べたページです(広告を含みます)。

出典:IPA「ITパスポート試験 シラバス Ver6.5」。 練習問題は当サイトが説明のために作ったものです。

タイトルとURLをコピーしました