プログラミング 3 スタックとキュー
データ構造 データ構造:コンピュータがデータを扱うときに,扱 いやすくなるように加工したもの 今回扱うスタック(stack)とキュー(queue)は, データを一時的に蓄えるバッファと呼ばれるもののひ とつ
スタック(1) 「入れる」「出す」の操作を持つバッファ トレイの山を想像するとよい 入れる:プッシュ(push) 出す:ポップ(pop) トレイの山を想像するとよい 入れられた(プッシュされた)データは山のてっぺんに積ま れる 取り出し(ポップ)は山のてっぺんに対して行う 最後に入れたものが最初に出てくる:Last-In First-Out(LIFO)
スタック(2) 3 4 ↓ ↓ ↓ ↑ ↓ ↑ 3 4 2 2 2 2 2 1 1 1 1 1 1 1をプッシュ 2をプッシュ 3をプッシュ ポップ 4をプッシュ ポップ 3 4 2 2 2 2 2 1 1 1 1 1 1
スタックの実装(1) 簡易なものは配列で実装できる 必要な変数宣言 int stack[STACKSIZE]; int sp = 0; スタック本体となる配列 スタックに何個データが入っているかを保持する変数(ス タックポインタ) 必要な変数宣言 int stack[STACKSIZE]; int sp = 0; STACKSIZE はスタックの容量(大きさ)を定義した記号定 数
スタックの実装(2) ↓ 2 2 X X X プッシュ スタックポインタの位置に 値を入れる スタックポインタを 1 増 やす sp→
スタックの実装(3) 2 ↑ 2 2 X X X ポップ スタックポインタを 1 減 らす スタックポインタの位置の 値を返す sp→
キュー(1) 「入れる」「出す」の操作を持つバッファ レジや ATM の待ち行列を想像するとよい 入れる:エンキュー(enqueue) 出す:デキュー(dequeue) レジや ATM の待ち行列を想像するとよい 入れられた(エンキューされた)データは列の末尾に入れら れる 取り出し(デキュー)は列の先頭に対して行う 最初に入れたものが最初に出てくる:First-In First-Out(FIFO)
キュー(2) 1 ← 1 をエンキュー 1 2 ← 2 をエンキュー 1← 2 デキュー 2 3 ← 3 をエンキュー 2← 3 デキュー
キューの実装(1) 簡易なものは配列で実装できる キュー本体となる配列 キューの先頭・末尾を覚える変数(またはキューの先頭と データの個数を覚える変数) 必要な変数宣言 int queue[QUEUESIZE]; int head = 0, tail = 0; QUEUESIZE はキューの容量(大きさ)を定義した記号定数
キューの実装(2) 2 3 2 3 4 ← 2 3 4 エンキュー キューの末尾位置に値を代入する キューの末尾の要素 番号を 1 増やす キューの末尾の要素 番号を 1 増やす ↓head ↓tail 2 3 ↓head ↓tail 2 3 4 ← ↓head ↓tail 2 3 4
キューの実装(3) 2 3 4 2← 3 4 ← 3 4 デキュー キューの先頭位置の値を取り出す キューの先頭の要素 番号を 1 増やす キューの先頭の要素 番号を 1 増やす ↓head ↓tail 2 3 4 ↓head ↓tail 2← 3 4 ← ↓head ↓tail 3 4
スタックとキュー 使用頻度が高く,実装が容易なのはスタックのほう 格納できるデータ量に事実上制限がない実装もある (難しい) キューについては,リングバッファという実装方法もある