データ構造と アルゴリズム第4回 知能情報学メジャー 和田俊和.

Slides:



Advertisements
Similar presentations
アルゴリズムとデータ構造 第2回 線形リスト(復習).
Advertisements

プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
5.データ構造入門 5-1.連結リスト(Linked List) 5-2.スタック(Stack) 5-3.キュー(Queue)
ISD実習E 2009年6月29日 LISPシステム入門 (第5回) 関数ポインタ eval システム関数.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
データ構造とアルゴリズム 第10回 mallocとfree
基本情報技術概論(第4回) 埼玉大学 理工学研究科 堀山 貴史
2章 データ構造.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
情報工学概論 (アルゴリズムとデータ構造)
オペレーティングシステムJ/K 2004年11月4日
第8回 プログラミングⅡ 第8回
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月10日、H.15(‘03)] 今日のメニュー 1 前回の課題の復習
プログラミング論 II 電卓,逆ポーランド記法電卓
データ構造とアルゴリズム 第13回 スタックとキュー
データ構造とアルゴリズム 第5回 スタック ~ データ構造(2)~.
Stack & Queue & List 3.
アルゴリズムと データ構造 第4回 スタック・キュー.
第4回放送授業.
第4章 空間解析 2.ネットワーク分析 (3) ネットワーク構造分析
アルゴリズムとデータ構造 第2回 線形リスト(復習その2).
アルゴリズムとデータ構造 第4回 配列によるスタックとキュー.
①データ構造 ②アルゴリズム ③プログラム言語 ④マークアップ言語
演習問題の答え #include #include #define NUM 5 typedef struct { // 構造体の定義 float shincho; // 身長 float taiju; // 体重 } shintai; void hyouji(shintai.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
二分探索木によるサーチ.
データ構造とプログラミング技法 (第2回) ー線形構造ー.
2009/10/16 いろいろなデータ構造 第3講: 平成21年10月16日 (金) 4限 E252教室 コンピュータアルゴリズム.
アルゴリズムとデータ構造 2012年6月28日
アルゴリズムとデータ構造 2011年6月27日
データ構造とアルゴリズム 第5回 スタック ~ データ構造(2)~.
データ構造とアルゴリズム (第2回) ー線形構造ー.
データ構造とアルゴリズム 第6回 キュー ~ データ構造(2)~.
アルゴリズムとデータ構造1 2006年6月16日
プログラミング 4 記憶の割り付け.
知能情報工学演習I 第12回(後半第6回) 課題の回答
プログラミング言語論 第13回 オブジェクト指向 情報工学科 篠埜 功.
アルゴリズムとデータ構造1 2005年7月1日
アルゴリズムとデータ構造1 2009年6月29日
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
第5回放送授業.
アルゴリズムとデータ構造 2010年7月26日
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
プログラミング 3 スタックとキュー.
明星大学 情報学科 2012年度 後期   情報技術Ⅱ   第8回
演習0 func0, func1, func2を作成せよ. main()関数の中で,func0()を呼び出しを実行せよ.
アルゴリズムとデータ構造 2011年7月8日課題の復習
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
スタックとキュー データ構造とプログラミング (第5回).
基本情報技術概論I (第4回) 埼玉大学 理工学研究科 堀山 貴史
6.データ構造入門 6-1.連結リスト(Linked List) 6-2.スタック(Stack) 6-3.キュー(Queue)
情報数理Ⅱ 第11章 データ構造 平成29年1月18日.
基本情報技術概論(第10回) 埼玉大学 理工学研究科 堀山 貴史
データ構造とアルゴリズム (第3回) 静岡大学工学部 安藤和敏
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
アルゴリズムとデータ構造1 2008年7月24日
オペレーティングシステムJ/K (管理のためのデータ構造)
アルゴリズムとデータ構造 2013年7月1日
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
pf-6. スタック (Python プログラミング基礎を演習で学ぶシリーズ)
関数と再帰 教科書13章 電子1(木曜クラス) 2005/06/22(Thu.).
プログラミング演習I 2003年6月11日(第9回) 木村巌.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
データ構造と アルゴリズムI 第三回 知能情報学部 新田直也.
第10回 関数と再帰.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
岩村雅一 知能情報工学演習I 第13回(後半第7回) 岩村雅一
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
Presentation transcript:

データ構造と アルゴリズム第4回 知能情報学メジャー 和田俊和

第2章 基本的なデータ構造 2.1 配列 2.2 リンク配置 2.3 連結リスト 2.4 スタック 2.5 キュー 2.6 木構造

2.4スタック 線形構造の片方だけから追加(push)と取り出し (pop)が出来るデータ構造.(データ抽象化) コンピュータの基本ソフトウエア(OS)や, ミドルウエア(コンパイラなどの言語処理系) で多用される.

2.4.1スタックの基本操作 線形構造の片方だけから追加(push)と取り出し (pop)が出来るデータ構造. ⇒Last In First Out (LIFO)とも呼ばれる

2.4.2スタックの実装 配列で表した場合: topは次にpushする場所.top>n-1で満杯の状態 を表している.

2.4.2スタックの実装 pushとpop

twada$ ./a.out akasakA twada$ C プログラムの例 #include <stdio.h> #include <stdlib.h> #define Num 10 char Stack[Num]; int top=0; void push(char c) { if (top>Num-1) { perror("Stack overflow\n"); exit(1); } Stack[top++]=c; char pop() if (top==0) { perror("Stack underflow\n"); return Stack[--top]; int main() {    char *str="Akasaka";    while(*str) { push(*str); str++;    }    while(top) printf("%c",pop());    printf("\n"); } twada$ ./a.out akasakA twada$

2.5キュー 配列の片方から追加(enqueue)し,反対側から 取り出し(dequeue)が出来るデータ構造. プリンタのバッファなど速度緩衝用メモリや, 木やグラフな どの横型探索に 使われる.

2.5.1キューの基本操作 最初にenqueueしたデータが最初に取り出され るので,First In First Out (FIFO)とも呼ばれる.

2.5.2キューの実装 配列を用いた実装 rearは次にenqueueする場所,frontは次に dequeueする場所.

2.5.2キューの実装 rear>n-1でOverflow front==rearでUnderflow

twada$ ./a.out Akasaka twada$ C プログラムの例 #include <stdio.h> #include <stdlib.h> #define Num 10 char Queue[Num]; int front=0; int rear=0; void enqueue(char c) { if (rear>Num-1) { perror("Queue overflow\n"); exit(1); } Queue[rear++]=c; char dequeue() if (front==rear) { perror("Queue underflow\n"); return Queue[front++]; int main() {    char *str="Akasaka";    while(*str) { enqueue(*str); str++;    }    while(front!=rear) printf("%c",dequeue());    printf("\n"); } twada$ ./a.out Akasaka twada$

2.5.3リングバッファ(改良されたキュー) キューではenqueしてもdequeueしてもfrontも rearも増加する一方. キューを環状ににしたのがリングバッファ

スタック/キューは何のために用いるか 系統的な記憶と想起のメカニズム スタック(LIFO) キュー(FIFO) 環境の保存と参照ー>再帰呼び出し 木・グラフの縦型探索 キュー(FIFO) バッファ(緩衝用)メモリ、装置間の速度差の吸収 木・グラフの横型探索

スタックの利用の例:1 迷路の探索:

探索木

迷路の探索アルゴリズム

list にスタックを用いた場合

木の縦型探索とスタック

再帰的構造 0, i=0 f(i)= 1, i=1 f(i-1)+f(i-2), i≧2 Fibonacci 数 int Fib(int i) { switch(i){ case 0: return(0);break; case 1: return(1);break; default: return(Fib(i-1)+Fib(i-2));} }

再帰的構造 Fib(3)→Fib(2)+Fib(1) →(Fib(1)+Fib(0))+1 →(1+0)+1 int Fib(int i) { switch(i){ case 0: return(0);break; case 1: return(1);break; default: return(Fib(i-1)+Fib(i-2));} } Fib(3)→Fib(2)+Fib(1) →(Fib(1)+Fib(0))+1 →(1+0)+1

再帰的構造 同じ変数名であっても、関数呼び出しの度に、別の記憶領域が確保される(スタックを利用している。) 変数の内容は、他の関数呼び出しによって破壊されることはない。

演習問題 設問3 5,4,8がこの順にpopされ,底から2,7,6 がスタックに残る. 設問4 5,2がこの順にdequeueされ,7,3が queueの中身(次にdequeueすると3が取り出さ れる.)

演習問題 設問5(レポートの提出) if ((front-rear+n)%n==1) rear=(rear+1)%n; front=(front+1)%n;