アルゴリズム入門2:データ構造

luagate/zoom-lessons/2026-04/cs-algorithms-2CS理論 - データ構造52コンピュータサイエンス

上から下へ、全 52 枚そのまま並べています。

発表モードで開く

CS理論 - データ構造

アルゴリズム入門2:データ構造

データの「入れ物」を使いこなそう

1
1

目次

今日の流れ

前回の復習:アルゴリズムと3つの基本構造

変数とデータ型:型変換・型エラーも学ぼう

配列(Array):番号付きロッカー + ループ活用

スタック(Stack):お皿の山

キュー(Queue):レジの行列

まとめ & 演習

2
2

CS理論 - データ構造

0

前回の復習

アルゴリズムと3つの基本構造をおさらい

3
3
CS理論 - データ構造

前回学んだこと

アルゴリズム入門1のポイントを振り返りましょう。

アルゴリズム
  • 問題を解くための明確で有限な手順
  • 誰がやっても同じ結果になる
順次
  • 上から順番に1つずつ実行する
分岐
  • 条件によって処理を切り替える
繰り返し
  • 条件を満たすまで同じ処理を繰り返す
4
4
CS理論 - データ構造

今日のテーマ:データの「入れ物」

アルゴリズムが「手順」なら、データ構造は「データの整理のしかた」。どんな入れ物を選ぶかで、処理の効率が大きく変わります。

  • データ構造 = データを効率的に保管・取り出す仕組み
  • 同じデータでも入れ物が違えば、得意な操作が違う
  • まずは「データの種類」を知ってから、「入れ物」の話へ進みます
5
5

CS理論 - データ構造

1

変数とデータ型

データに名前をつけて、種類を区別しよう

6
6
CS理論 - データ構造

変数とは

プログラミングで最初に出会う、もっとも基本的な概念です。

変数(へんすう)

データに名前をつけて保存しておく「箱」のこと。

箱に「名前」をつけて中身を入れる

あとから中身を取り出したり、書き換えたりできる

同じ名前の箱は1つだけ ― 上書きされる

7
7
CS理論 - データ構造

変数を日常で例えると

「ラベル付きの箱」をイメージしましょう。ラベルが変数名、中身がデータです。

名前ラベル
  • 箱に「名前」と書いて、中に「田中太郎」を入れる
  • name = "田中太郎"
年齢ラベル
  • 箱に「年齢」と書いて、中に「20」を入れる
  • age = 20
学生ラベル
  • 箱に「学生?」と書いて、中に「はい」を入れる
  • is_student = True
8
8
CS理論 - データ構造

3つの基本データ型

変数に入れるデータには「型(タイプ)」があります。まずはこの3つを覚えましょう。

中身の種類

数値(int / float)

数値(int / float)

整数や小数などの数

42, 3.14, -10

文字列(str)

文字列(str)

文字の並び(テキスト)

"こんにちは", "ABC"

真偽値(bool)

真偽値(bool)

True か False の2択

True, False

9
9
CS理論 - データ構造

数値 vs 文字列 ― 見た目は似てるけど違う

「100」と 100 は別物です。型が違うと計算結果も変わります。

数値の 100

  • 100 + 200 = 300
  • 計算ができる
  • 足し算・引き算・比較に使う

文字列の "100"

  • "100" + "200" = "100200"
  • 文字として「くっつく」
  • 表示やメッセージに使う
10
10
CS理論 - データ構造

データ型の使い分け

どんなときにどの型を使うか、イメージをつかみましょう。

計算したい

数値型(int / float)を使う。テストの点数、値段、距離など

文字を扱いたい

文字列型(str)を使う。名前、住所、メッセージなど

Yes / No を判定したい

真偽値型(bool)を使う。ログイン済み?、合格?など

11
11
CS理論 - データ構造
クイズ

データ型クイズ

データ型の違いを確認しましょう。

Pythonで "5" + "3" の結果は?

A
8
B
"53"
C
"8"
D
エラーになる
12
12
CS理論 - データ構造
答え

データ型クイズ:答え

Pythonで "5" + "3" の結果は?

A
8
B
"53"
C
"8"
D
エラーになる

ダブルクォートで囲まれているので文字列。文字列同士の + は「連結」になり、"5" + "3" = "53" です。計算したいなら int("5") + int("3") と型変換が必要です。

13
13
CS理論 - データ構造

変数 + データ型 → データ構造へ

変数は「1つのデータ」を入れる箱でした。でも、たくさんのデータをまとめて扱いたいときは?そこで登場するのが「データ構造」です。

  • 変数 = 1つのデータを入れる箱
  • データ型 = 箱の中身の種類(数値・文字列・真偽値)
  • データ構造 = 複数の箱をまとめて整理する方法
  • ここから先は「データの並べ方」を学んでいきます
14
14
CS理論 - データ構造

型変換 ― 型を変えるには?

型が違うとエラーになることがあります。そのときは「型変換」で型を揃えましょう。

文字列 → 数値

  • int("42") → 42(整数に変換)
  • float("3.14") → 3.14(小数に変換)
  • 計算したいときに使う

数値 → 文字列

  • str(42) → "42"(文字列に変換)
  • メッセージに数字を混ぜたいときに使う
  • "点数は" + str(100) + "点"
15
15
CS理論 - データ構造

型エラーはこうして起きる

型が合わないとPythonはエラーを出します。型変換で解決できます。

エラーになるコード

コード
結果
"点数:" + 85
TypeError!
"5" + 3
TypeError!
int("hello")
ValueError!

型変換で解決

コード
結果
"点数:" + str(85)
"点数:85"
int("5") + 3
8
int("123")
123
16
16

CS理論 - データ構造

2

配列(Array)

番号付きロッカーにデータを並べる

17
17
CS理論 - データ構造

配列とは

もっとも基本的なデータ構造。データを番号付きで一列に並べて保管します。

配列(Array)

データを連続した番号(インデックス)付きで一列に並べたデータ構造。

番号は0から始まる(0, 1, 2, 3...)

番号を指定すれば、一瞬でデータを取り出せる

あらかじめサイズを決めて使うのが基本

18
18
CS理論 - データ構造

配列を靴箱でイメージしよう

学校の靴箱と同じ仕組みです。番号が分かれば、すぐに自分の靴が取り出せます。

0番の箱

田中さんの靴

1番の箱

鈴木さんの靴

2番の箱

佐藤さんの靴

3番の箱

山田さんの靴

19
19
CS理論 - データ構造

配列の基本操作

配列でよく使う操作と、その特徴を確認しましょう。

操作
説明
速さ

アクセス

インデックスで取得

番号を指定して一瞬で取り出す

とても速い

検索

値を探す

先頭から順番に見ていく

データ量に比例

追加

末尾に追加

最後に1つ足すだけ

速い

挿入

途中に入れる

後ろのデータを全部ずらす必要あり

遅い

削除

途中を消す

抜けた分を詰める必要あり

遅い

20
20
CS理論 - データ構造

配列の途中に挿入すると?

映画館の座席で考えてみましょう。途中に割り込むと、後ろの人が全員ずれなければなりません。

挿入前

0番
1番
2番
3番
りんご
みかん
ぶどう
もも

1番に「バナナ」を挿入後

0番
1番
2番
3番
4番
りんご
バナナ
みかん
ぶどう
もも
21
21
CS理論 - データ構造

配列の身近な例

配列は日常のあちこちに隠れています。

電車の座席
  • 1号車の1番席、2番席...と番号で管理
  • 座席番号が分かれば一瞬で見つかる
マンションの部屋
  • 101号室、102号室...と番号で並ぶ
  • 部屋番号で住人を特定できる
出席番号
  • 1番から順に名前が並ぶ名簿
  • 番号で呼べばすぐ分かる
22
22
CS理論 - データ構造

配列 × ループ ― 全部を順番に処理する

配列とループを組み合わせると、全要素をまとめて処理できます。これがプログラミングの真骨頂!

  • 配列の要素を1つずつ取り出して処理するのが「ループ」
  • for文を使うと配列の長さに関わらず全部処理できる
  • 手動で1つずつ書く必要がない
23
23
CS理論 - データ構造

ループなし vs ループあり

ループを使うと、データが100個になっても1行も増えません。

ループなし(非効率)

コード
print(fruits[0])
print(fruits[1])
print(fruits[2])
print(fruits[3])
要素が増えるたびに行が増える...

ループあり(効率的)

コード
for fruit in fruits:
print(fruit)
要素が何個になっても2行だけ!
24
24
CS理論 - データ構造
クイズ

配列クイズ

配列の基本を確認しましょう。

配列 ["A", "B", "C", "D"] のインデックス2の要素は?

A
A
B
B
C
C
D
D
25
25
CS理論 - データ構造
答え

配列クイズ:答え

配列 ["A", "B", "C", "D"] のインデックス2の要素は?

A
A
B
B
C
C
D
D

インデックスは0から数えるのがポイントです。

26
26

CS理論 - データ構造

3

スタック(Stack)

最後に入れたものを最初に取り出す

27
27
CS理論 - データ構造

スタックとは

名前の通り「積み重ねる」データ構造。お皿を積むイメージです。

スタック(Stack)

データを上に積み重ね、一番上からしか取り出せないデータ構造。LIFO(Last In, First Out)方式。

LIFO = 最後に入れたものが最初に出てくる

操作は2つだけ:push(積む)と pop(取る)

途中のデータには直接アクセスできない

28
28
CS理論 - データ構造

スタックの身近な例

「最後に入れたものから取り出す」場面は、意外とたくさんあります。

お皿の山
  • 洗ったお皿を上に重ねる
  • 使うときは一番上から取る
ポテトチップスの筒
  • 最後に入れたチップスが最初に出てくる
  • 底のチップスは最後まで取れない
引っ越しの段ボール
  • 最後に積んだ箱から開ける
  • 下の箱を取るには上を全部どかす
29
29
CS理論 - データ構造

push と pop の流れ

スタックの操作はとてもシンプル。pushで上に積み、popで上から取るだけです。

空のスタック — 最初は何もない状態
push(A) — Aを積む → [A]
push(B) — Bを上に積む → [A, B]
push(C) — Cを上に積む → [A, B, C]
pop() — 一番上のCを取り出す → [A, B]
30
30
CS理論 - データ構造

スタックの push / pop フロー

pushは上に積む、popは上から取る。スタックの操作はこの2つだけです。

push(積む)

  • データを一番上に追加する
  • stack.append(データ)
  • 空のスタックにも追加できる

pop(取る)

  • 一番上のデータを取り出す
  • stack.pop()
  • 空のスタックでpopするとエラー
31
31
CS理論 - データ構造

スタックが使われている場面

スタックはプログラムの中で大活躍しています。身近な機能の裏側で動いています。

ブラウザの「戻る」ボタン

  • ページAを開く → pushでAを積む
  • ページBに移動 → pushでBを積む
  • 「戻る」を押す → popでBを取り出す
  • 画面がAに戻る

「元に戻す」(Undo)

  • 文字を打つたびpushで操作を記録
  • Ctrl+Z を押す → popで最後の操作を取り消す
  • 何度も押せば、どんどん巻き戻る
32
32
CS理論 - データ構造
クイズ

スタッククイズ

スタックの動きを頭の中でシミュレーションしてみましょう。

push(1) → push(2) → push(3) → pop() → pop() の後、スタックに残っているのは?

A
[1]
B
[2]
C
[3]
D
[1, 2]
33
33
CS理論 - データ構造
答え

スタッククイズ:答え

push(1) → push(2) → push(3) → pop() → pop() の後、スタックに残っているのは?

A
[1]
B
[2]
C
[3]
D
[1, 2]

pop は一番上から取り出します。3が取れて、次に2が取れて、1だけ残ります。

34
34

CS理論 - データ構造

4

キュー(Queue)

先に並んだ人から順番に処理する

35
35
CS理論 - データ構造

キューとは

「行列」を英語にすると Queue。まさにそのまま行列の仕組みです。

キュー(Queue)

データを後ろに追加し、先頭から取り出すデータ構造。FIFO(First In, First Out)方式。

FIFO = 最初に入れたものが最初に出てくる

操作は2つ:enqueue(並ぶ)と dequeue(処理する)

順番を守る必要がある場面で活躍する

36
36
CS理論 - データ構造

キューの身近な例

先着順で処理するものは、すべてキューです。

コンビニのレジ
  • 先に並んだお客さんから会計する
  • 後から来た人は列の最後に並ぶ
遊園地の待ち列
  • 先に並んだ人から乗れる
  • 割り込みは禁止
病院の受付
  • 受付番号が早い人から呼ばれる
  • 後から来た人は待合室で待つ
37
37
CS理論 - データ構造

enqueue と dequeue の流れ

キューの操作を順番に追ってみましょう。後ろに並んで、前から出ていきます。

空のキュー — 最初は誰も並んでいない
enqueue(A) — Aが列に並ぶ → [A]
enqueue(B) — Bが後ろに並ぶ → [A, B]
enqueue(C) — Cが後ろに並ぶ → [A, B, C]
dequeue() — 先頭のAが処理される → [B, C]
38
38
CS理論 - データ構造

スタック vs キュー

どちらもデータを出し入れする構造ですが、「どちら側から出すか」が正反対です。

スタック(LIFO)

  • 最後に入れたものから取り出す
  • push / pop で操作
  • 例:お皿の山、Undo機能
  • 一方向のみ(上から)

キュー(FIFO)

  • 最初に入れたものから取り出す
  • enqueue / dequeue で操作
  • 例:レジの行列、印刷キュー
  • 二方向(後ろから入れて前から出す)
39
39
CS理論 - データ構造

キューが使われている場面

コンピュータの裏側でも、キューはたくさん使われています。

印刷キュー

先に送った文書から順番に印刷される

メッセージキュー

先に送ったメッセージから順番に届く

ダウンロード待ち

先に開始したファイルから順番に完了する

チャットサポート

先に問い合わせた人から順番に対応される

40
40
CS理論 - データ構造
クイズ

キュークイズ

キューの動きを確認しましょう。

enqueue(X) → enqueue(Y) → enqueue(Z) → dequeue() で取り出されるのは?

A
X
B
Y
C
Z
D
何も取り出せない
41
41
CS理論 - データ構造
答え

キュークイズ:答え

enqueue(X) → enqueue(Y) → enqueue(Z) → dequeue() で取り出されるのは?

A
X
B
Y
C
Z
D
何も取り出せない

FIFO(先入れ先出し)なので、最初に入れた X が取り出されます。スタックと逆ですね。

42
42

CS理論 - データ構造

5

まとめ & 演習

3つのデータ構造を使い分けよう

43
43
CS理論 - データ構造

3つのデータ構造を比較

配列・スタック・キュー、それぞれの特徴を一覧で整理しましょう。

特徴
配列
スタック
キュー

取り出し方

取り出し方

番号を指定

一番上から

先頭から

ルール

ルール

自由にアクセス

LIFO(後入れ先出し)

FIFO(先入れ先出し)

追加場所

追加場所

末尾 or 途中

上(末尾)

後ろ(末尾)

身近な例

身近な例

靴箱・出席番号

お皿の山・Undo

レジの行列・印刷

44
44
CS理論 - データ構造

操作の速さくらべ

それぞれのデータ構造が「得意な操作」と「苦手な操作」を比べてみましょう。数字は速さのイメージ(高いほど速い)。

100806040200
100
20
95
95
90
90
配列:アクセス
配列:挿入
スタック:push
スタック:pop
キュー:enqueue
キュー:dequeue

出典: 操作速度のイメージスコア

45
45
CS理論 - データ構造

どのデータ構造を使う?

場面に応じてデータ構造を選ぶ判断フローです。

データをどう使う?
番号で自由にアクセスしたい
配列(Array)を使う
最後に入れたものから取り出したい
スタック(Stack)を使う
先に入れたものから順番に処理したい
キュー(Queue)を使う
46
46
CS理論 - データ構造

演習:どのデータ構造?

次の場面ではどのデータ構造がぴったりか、考えてみましょう。

問題 1
  • テストの点数を生徒番号で管理したい
  • 5番の生徒の点数をすぐ見たい
問題 2
  • Webブラウザの「戻る」機能を作りたい
  • 直前に見たページに戻りたい
問題 3
  • カスタマーサポートの対応順を管理したい
  • 先に問い合わせた人から対応したい
47
47
CS理論 - データ構造

演習の答え合わせ

それぞれの場面にぴったりなデータ構造はこちらです。

  • 問題1:配列(Array) ― 番号でアクセスするなら配列が最適
  • 問題2:スタック(Stack) ― 「最後に見たページ」から戻るのはLIFO
  • 問題3:キュー(Queue) ― 先着順で処理するのはFIFO
  • データの「使い方」に合わせて構造を選ぶことが大切
48
48
CS理論 - データ構造

演習2:コードを読んでみよう

次のコードを見て、何をしているか考えてみましょう。

問題A
  • stack = []
  • stack.append("A")
  • stack.append("B")
  • print(stack.pop())
  • → 何が表示される?
問題B
  • nums = [10, 20, 30]
  • for n in nums:
  • print(n * 2)
  • → 何が表示される?
問題C
  • from collections import deque
  • q = deque()
  • q.append("X")
  • q.append("Y")
  • print(q.popleft())
  • → 何が表示される?
49
49
CS理論 - データ構造

演習2:答え合わせ

それぞれの出力を確認しましょう。なぜそうなるかを説明できればOKです。

問題
出力
理由

問題A

問題A

"B"

スタックはLIFO ― 最後に入れたBが出る

問題B

問題B

20, 40, 60

forループで各要素を×2して表示

問題C

問題C

"X"

キューはFIFO ― 最初に入れたXが出る

50
50
CS理論 - データ構造

今日のまとめ

今日学んだ3つのデータ構造を振り返りましょう。

  • 配列 = 番号付きロッカー。インデックスで高速アクセスできる
  • スタック = お皿の山。LIFO方式で、pushとpopで操作する
  • キュー = レジの行列。FIFO方式で、enqueueとdequeueで操作する
  • 場面に応じて使い分けることで、効率的なプログラムが書ける
  • 次回はさらに高度なデータ構造(リスト・ツリー・ハッシュ)を学びます
51
51
"

良いプログラマはコードを書く。偉大なプログラマはデータ構造を選ぶ。

― この授業のまとめ

52
52