Stack & Queue & List 3.

Slides:



Advertisements
Similar presentations
次ページに関数の解答例 課題12-1 (問題と解答) 複素数xとして, 実部を入力してください.10 虚部を入力してください.20
Advertisements

プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
5.データ構造入門 5-1.連結リスト(Linked List) 5-2.スタック(Stack) 5-3.キュー(Queue)
第2章 数値の入力と変数 scanfと変数をやります.
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
基本情報技術概論(第4回) 埼玉大学 理工学研究科 堀山 貴史
Ibaraki Univ. Dept of Electrical & Electronic Eng.
プログラミング論 I 関数の再帰呼び出し
情報工学概論 (アルゴリズムとデータ構造)
C言語講座 第4回 ポインタ.
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
第6章 2重ループ&配列 2重ループと配列をやります.
情報理論2 第6回 小林 学 湘南工科大学 2011年11月15日 〒 神奈川県藤沢市辻堂西海岸1-1-25
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月10日、H.15(‘03)] 今日のメニュー 1 前回の課題の復習
プログラミング論 II 電卓,逆ポーランド記法電卓
データ構造とアルゴリズム 第13回 スタックとキュー
アルゴリズムとデータ構造 第2回 線形リスト(復習その2).
アルゴリズムとデータ構造 第4回 配列によるスタックとキュー.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
構造体 構造体, 構造体とポインタの組み合わせ,.
データ構造とプログラミング技法 (第2回) ー線形構造ー.
2009/10/16 いろいろなデータ構造 第3講: 平成21年10月16日 (金) 4限 E252教室 コンピュータアルゴリズム.
茨城大学 工学部 知能システム工学科 井上 康介 E2棟801号室
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
データ構造とアルゴリズム (第2回) ー線形構造ー.
情報処理演習 (秋学期・樋口担当) 3回目 10/8 日本工業大学 コンピュータリテラシーII.
第11回 宿題 出題日:12月21日 締切日:1月7日(木).
データ構造とアルゴリズム 第6回 キュー ~ データ構造(2)~.
プログラミング 4 記憶の割り付け.
データ構造と アルゴリズム第4回 知能情報学メジャー 和田俊和.
木の走査.
プログラミング序論 2. n人のインディアン.
プログラミング2 関数の再帰呼び出し
プログラミング入門2 第11回 情報工学科 篠埜 功.
今までの練習問題の復習.
第7回 プログラミングⅡ 第7回
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
第11回 プログラミングⅡ 第11回
アルゴリズムとデータ構造1 2005年7月1日
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
Cプログラミング演習 第10回 二分探索木.
高度プログラミング演習 (05).
高度プログラミング演習 (05).
関数の再帰呼び出しとは ハノイの塔 リダイレクト レポート課題
プログラミング基礎B 文字列の扱い.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
プログラミング 4 木構造とヒープ.
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
疑似乱数, モンテカルロ法によるシミュレーション
プログラミング 3 スタックとキュー.
アルゴリズムとデータ構造 2011年7月8日課題の復習
基本情報技術概論I (第4回) 埼玉大学 理工学研究科 堀山 貴史
6.データ構造入門 6-1.連結リスト(Linked List) 6-2.スタック(Stack) 6-3.キュー(Queue)
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
データ構造とアルゴリズム (第3回) 静岡大学工学部 安藤和敏
知能情報工学演習I 第11回( C言語第5回) 課題の回答
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
第11回放送授業.
地域情報学 C言語プログラミング 第4回 while文、do~while文、switch文、 2次元配列、ポインタ 2017年11月10日
ネットワーク・プログラミング Cプログラミングの基礎.
プログラミング2 関数の再帰呼び出し
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
高度プログラミング演習 (07).
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
TList リスト構造とは? 複数のデータを扱うために、 データの内容と、次のデータへのポインタを持つ構造体を使う。
第2章 数値の入力と変数 scanfと変数をやります.
プログラミング演習I 補講用課題
= 55 課題6-1 #define _CRT_SECURE_NO_WARNINGS
Presentation transcript:

Stack & Queue & List 3

スタック スタックとは、データを棚の下から積んでいき、 必要に応じて上から順番に取り出す方法 (Last In First Out) …1次元配列を使用する (例)上図で考える。 (1)書類1,書類2、書類3という順序で棚に 入れる。(一番上から順に書類3, 書類2, 書類1) (2)取り出すときは一番上から順に取り出す。 (書類3, 書類2, 書類1)の順になる

push / pop push…スタックにデータを積む関数 pop…..スタックからデータを取り出す関数 stack[] スタック配列 sp……..スタックポインタ(一番上のものはどれ か) stack[sp++] = data; // push sp--; // pop

/* スタックのpush/pop */ #include <stdio.h> #define MaxSize 100 /* スタック・サイズ*/ int stack[MaxSize]; /* スタック*/ int sp=0; /* スタックポインタ*/ /* スタックに追加*/ /* return 0; 無事に追加できた*/ /* return -1; スタックがあふれた(これ以上はいらない) */ int push(int n) { if (sp < MaxSize) { stack[sp] = n; sp++; return 0; } else return -1; /* スタックが一杯*/

/* スタックからデータを取り出す*/ /* return 0; 無事に取り出せた*/ /* return 1; スタックが空なので取り出せない(sp <= 0) */ int pop(int *n) { if (sp > 0) { sp--; *n = stack[sp]; return 0; } else return -1; /* スタックが空*/ int main() { int c, n; while (printf("]"), (c=getchar())!=EOF) { rewind(stdin); if (c=='i' || c == 'I') { // push printf("data--> "); scanf("%d", &n); rewind(stdin); if (push(n)==-1) { printf("スタックが一杯\n"); if (c=='o' || c == 'O') { // pop if (pop(&n)==-1) printf("スタックは空\n"); printf("stack data --> %d\n", n);

ハノイの塔(シミュレーション)

/* ハノイの塔(シミュレーション) */ #include <stdio.h> #include <conio.h> void hanoi(int,int,int,int); void move(int,int,int); int pie[20][3]; /* 20:円盤の最大枚数、:棒の数*/ int sp[3],N; /* スタック・ポインタ*/ void main(void) { int i; printf("円盤の枚数? "); scanf("%d", &N); for (i=0;i<N;i++) pie[i][0] = N-i; /* 棒a に円盤を積む*/ sp[0]=N; sp[1]=0; sp[2]=0; /* スタック・ポインタの初期値設定*/ hanoi(N, 0, 1, 2); } void hanoi(int n,int a,int b,int c) { if (n>0) { hanoi(n-1, a, c, b); /* a からc へb を使って移動*/ move(n,a,b); /* 一番下の盤をa からb へ移動*/ hanoi(n-1, c, b, a); /* c からb へa を使って移動*/

void move(int n,int s,int d) { /* 円盤の移動シミュレーション*/ int i,j; pie[sp[d]][d] = pie[sp[s]-1][s]; /* s -> d へ円盤移動*/ sp[d]++; /* スタック・ポインタの更新*/ sp[s]--; /* 数字に対応. 0 = 'a' 1 = 'a'+1='b' 2='a'+2 = 'c' */ printf("\n%d 番の円盤を %c-->%c へ移す\n\n", n, 'a'+s, 'a'+d); for (i=N-1; i>=0;i--) { for (j=0;j<3;j++) { if (i<sp[j]) printf("%8d", pie[i][j]); else printf("  "); } printf("\n"); printf("\n   a    b    c"); getch(); /* エコー・なし*/

キュー キューとは,First Int First Out(最初に入れたもの を最初に取り出す) 順番待ちみたいなもの。 Queue[] …キュー Head; …….待ち行列の先頭 Tail; ……..待ち行列の終端 リング状の配列にする(無駄がないように) head と tail の間に1つスペースを空けておく (head=tail となったとき、空の状態と区別でき ない。

/* キュー*/ #include <stdio.h> #define MaxSize 100 /* キュー・サイズ*/ int queue[MaxSize]; int head=0; /* 先頭データへのポインタ*/ int tail=0; /* 終端データへのポインタ*/ int queuein(int); int queueout(int *); void main(void) { int c, n; while (printf("]"), (c=getchar())!=EOF) { rewind(stdin); if (c=='i' || c == 'I') { printf("data--> "); scanf("%d", &n); rewind(stdin); if (queuein(n)==-1) { printf("キューが一杯\n"); } if (c=='o' || c == 'O') { if (queueout(&n)==-1) printf("キューは空\n"); else printf("queue data --> %d\n", n);

int queuein(int n) { /* キューにデータを入れる*/ if ((tail+1)%MaxSize != head) {  /*tail が head の直前にない*/ queue[tail] = n; tail++; tail=tail%ModSize; return 0; } else return -1; /* キューが一杯*/ int queueout(int *n) { /* キューからデータを取り出す*/ if (tail!=head) { *n=queue[head]; head++; head=head%ModSize; return -1; /* キューが空*/

キューデータの表示 head から tail をエコーする

/* キュー*/ #include <stdio.h> #define MaxSize 100 /* キュー・サイズ*/ int queue[MaxSize]; int head=0; /* 先頭データへのポインタ*/ int tail=0; /* 終端データへのポインタ*/ int queuein(int); int queueout(int *); void disp(void); // 追加 void main(void) { int c, n; while (printf("]"), (c=getchar())!=EOF) { rewind(stdin); switch (c) { case 'i': case 'I': printf("data--> "); scanf("%d", &n); rewind(stdin); if (queuein(n)==-1) printf("キューが一杯\n"); break; case 'o': case 'O': if (queueout(&n)==-1) printf("キューは空\n"); else printf("queue data--> %d\n", n); case 'l': case 'L': // 追加 disp(); }

int queuein(int n) { /* キューにデータを入れる*/ if ((tail+1)%MaxSize != head) { queue[tail] = n; tail++; tail=tail%maxSize; return 0; } else return -1; /* キューが一杯*/ int queueout(int *n) { /* キューからデータを取り出す*/ if (tail!=head) { *n=queue[head]; head++; head=head%maxSize; return -1; /* キューが空*/ void disp(void) { /* キューの内容を表示する*/ int i; i=head; while (i!=tail) { printf("%d\n", queue[i]); i++; i=i%MaxSize;

リストの作成

入力とは逆順なリスト キーボードから入力したデータとは逆順につな がったリストを作成 1番目に入力したデータを終端にする。 最後に入力したデータは最初(headで指す)

入力順のリストの作成 old …1つ前の領域を表すポインタ old->pointer=p; で、pをリストの後につなげ  old=p; でp位置を新たなold位置とする。 データ入力が終わったらポインタにNULLをおく

/* リストデータの作成(入力順)*/ #include <stdio.h> #include <malloc.h> struct tfield { char name[20]; char tel[20]; struct tfield *pointer; }; struct tfield *talloc(void); void main(void) { struct tfield *head, *p, *old; head = talloc(); scanf("%s %s", head->name, head->tel); old=head; while (p=talloc(), scanf("%s %s", p->name, p->tel)!=EOF) { old->pointer = p; old = p; } old->pointer = NULL; p=head; while (p!=NULL) { printf("%15s%15s\n", p->name, p->tel); p=p->pointer; struct tfield *talloc(void) { return (struct tfield *)malloc(sizeof(struct tfield));

ダミー・ノード ダミー・ノードを先頭にいれたリストを作る さっきのやつは先頭ノードは前処理でリストに つなげておかなければならなかった. 今回はダミー・ノードを先頭として、2番目以降 のノードを実際のデータとするリストを考える。

/* リストデータの作成(ダミー・ノード)*/ #include <stdio.h> #include <malloc.h> struct tfield { char name[20]; char tel[20]; struct tfield *pointer; }; struct tfield *talloc(void); void main(void) { struct tfield *head, *p, *old; /* ダミー・ノード*/ head = talloc(); old=head; while (p=talloc(), scanf("%s %s", p->name, p->tel)!=EOF) { old->pointer = p; old = p; } old->pointer = NULL; p=head->pointer; // ダミー・ノードを飛ばす while (p!=NULL) { printf("%15s%15s\n", p->name, p->tel); p=p->pointer; struct tfield *talloc(void) { return (struct tfield *)malloc(sizeof(struct tfield));