Transcript slides13

データ構造とアルゴリズム
第13回 スタックとキュー
静岡大学工学部
安藤 和敏
2011.07.08
目次
1. 復習
2. データ処理の2つの順番
3. スタックの概念
4. リスト構造を用いたスタックの実装
5. キューの概念
6. リスト構造を用いたキューの実装
7. 演習
目次
1. 復習
2. データ処理の2つの順番
3. スタックの概念
4. リスト構造を用いたスタックの実装
5. キューの概念
6. リスト構造を用いたキューの実装
7. 演習
複数の仕事やデータの処理の順番
あなたは図書館で勉強していた.そこへ,あなたの
親友がやってきて恋愛相談に乗って欲しいと声を
かけられた.返事をしようとしていたら,親から携
帯に電話がかかってきた.
(A) 図書館で勉強する.
(B) 親友の恋愛相談に乗る.
(C) 携帯電話にでる.
(C) → (B) → (A) の順番で仕事をするのが普通.
複数の仕事やデータの処理の順番
あなたはファーストフード店で注文を受けるバイト
をしている.レジの前には3人の客が並んでいる.
あなたはこの3人の客から,
(A) チーズバーガーとコーラ
(B) てりやきバーガーとコーヒー
(C) フィッシュバーガーとコーヒー
という順番で注文を受けた.
(A) → (B) → (C) の順番で仕事をする.
複数の仕事やデータの処理の順番
(1) 処理要求の順番が遅いものから処理を済ませ
る.
(2) 処理要求の順番が早いものから処理を済ませ
る.
アルゴリズムの分野では,(1) の処理方法を LIFO
(Last In First Out の略,ライフォ,リフォと読む)と
呼び,(2) の処理をFIFO (First In First Out の略,
ファイフォ,フィフォと読む)と呼ぶ.
(1) のLIFO はスタック (stack) によって,(2) の
FIFO はキュー (queue) によって実現される.
目次
1. 復習
2. データ処理の2つの順番
3. スタックの概念
4. リスト構造を用いたスタックの実装
5. キューの概念
6. リスト構造を用いたキューの実装
7. 実習
スタックみたいなもの
スピンドルケース入りCD
本の山
スタックの概念図
格納
取り出し
6
3
5
2
4
1
スタックに対する操作(Push)
Push(x): スタックにデータ x を格納する.
x
2
4
1
スタックに対する操作(Pop)
Pop(): スタックからデータの取り出しを行い,取り
出したデータを返す.
2
4
1
目次
1. 復習
2. データ処理の2つの順番
3. スタックの概念
4. リスト構造を用いたスタックの実装
5. キューの概念
6. リスト構造を用いたキューの実装
7. 演習
リスト構造を用いたスタックの実装
格納
取り出し
2
4
1
root
2
4
1
関数 Push の説明
void Push(int x) {
struct CELL *newcell;
newcell = (struct CELL *)
malloc(sizeof(struct CELL));
newcell->data = x;
newcell->next = root;
root = newcell;
}
root
2
newcell
4
x
1
関数 Pop の説明
int Pop(void) {
int x;
struct CELL *temp;
if (root == NULL) {
printf("Error: Stack is empty.\n");
return;
}
x = root->data;
temp = root;
root = root->next;
free(temp);
temp
return x;
}
root
1
4
2
目次
1. 復習
2. データ処理の2つの順番
3. スタックの概念
4. リスト構造を用いたスタックの実装
5. キューの概念
6. リスト構造を用いたキューの実装
7. 演習
キューみたいなもの
キューの概念図
3
5
1 4 2
取り出し
格納
キューに対する操作 (Enqueue)
Enqueue(x): キューにデータ x を格納する.
x
1 4 2
キューに対する操作 (Dequeue)
Dequeue(): キューからデータの取り出しを行い,
取り出したデータを返す.
1 4 2
目次
1. 復習
2. データ処理の2つの順番
3. スタックの概念
4. リスト構造を用いたスタックの実装
5. キューの概念
6. リスト構造を用いたキューの実装
7. 演習
リスト構造を用いたキューの実装
1 4 2
取り出し
格納
tail
head
1
4
2
関数 Dequeue の説明
int Dequeue(void) {
int x;
struct CELL *temp;
if (head == NULL) {
printf("Error: Queue is empty.\n");
return;
}
x = head->data;
temp = head;
head = head->next;
free(temp);
temp
tail
if(head==NULL) tail=NULL;
return x;
1
4
2
}
head
関数 Enqueue の説明
void Enqueue(int x) {
struct CELL *newcell;
newcell = (struct CELL *)
malloc(sizeof(struct CELL));
newcell->data = x;
newcell->next = NULL;
if(tail!=NULL) tail->next = newcell;
tail = newcell;
if(head==NULL) head = newcell;
}
head
2
1
4
tail
newcell
x
目次
1. 復習
2. データ処理の2つの順番
3. スタックの概念
4. リスト構造を用いたスタックの実装
5. キューの概念
6. リスト構造を用いたキューの実装
7. 演習