第2回

Similar documents
Microsoft PowerPoint - 11.pptx

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc

Microsoft PowerPoint - 6.pptx

Microsoft PowerPoint - 06.pptx

Taro-リストⅠ(公開版).jtd

Taro-リストⅢ(公開版).jtd

第2回

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Microsoft Word - 中間試験 その1_解答例.doc

( ) ( ) 30 ( ) 27 [1] p LIFO(last in first out, ) (push) (pup) 1

PowerPoint Presentation

Microsoft PowerPoint - prog13.ppt

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

プログラム言語及び演習Ⅲ

アルゴリズムとデータ構造

Taro-スタック(公開版).jtd

memo

CプログラミングI

alg2015-3r3.ppt

プログラミングI第10回

Microsoft PowerPoint - lec10.ppt

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

memo

Microsoft Word - Cプログラミング演習(10)

Microsoft Word - 3new.doc

memo

Prog1_10th

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

memo

PowerPoint Template

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

PowerPoint プレゼンテーション

第3回 配列とリスト

Microsoft PowerPoint - kougi9.ppt

Taro-ポインタ変数Ⅰ(公開版).j

DVIOUT

memo

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

Microsoft PowerPoint pptx

cp-7. 配列

program7app.ppt

untitled

LIFO(last in first out, ) 1 FIFO(first in first out, ) 2 2 PUSH POP : 1

講習No.9

02: 変数と標準入出力

memo

DA13

Microsoft Word - Cプログラミング演習(9)

02: 変数と標準入出力

Microsoft Word - Cプログラミング演習(12)

プログラミング基礎

第1回 プログラミング演習3 センサーアプリケーション

<4D F736F F D2091E63589F182628CBE8CEA8D758DC08E9197BF2E646F6378>

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

Microsoft Word - no12.doc

gengo1-11

Taro-再帰関数Ⅱ(公開版).jtd

02: 変数と標準入出力

橡Pro PDF

Microsoft Word - Cプログラミング演習(11)

r07.dvi

ohp07.dvi

02: 変数と標準入出力

Taro-2分探索木Ⅰ(公開版).jtd

計算機ソフトウエア

02: 変数と標準入出力

第3回 配列とリスト

Microsoft PowerPoint - lec06 [互換モード]

スライド 1

PowerPoint Presentation

PowerPoint プレゼンテーション

alg2015-4r2.ppt

PowerPoint プレゼンテーション

Taro-ファイル処理(公開版).jtd

Microsoft PowerPoint - kougi7.ppt

情報処理演習 B8クラス

02: 変数と標準入出力

Prog1_15th

プログラミング及び演習 第1回 講義概容・実行制御

メソッドのまとめ

PowerPoint プレゼンテーション

演算増幅器

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

kiso2-09.key

Microsoft Word - 13

Microsoft Word - no15.docx

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

Microsoft PowerPoint - 12.ppt [互換モード]

Taro-最大値探索法の開発(公開版

< F2D837C E95CF CF68A4A94C5816A2E6A>

DVIOUT

/* do-while */ #include <stdio.h> #include <math.h> int main(void) double val1, val2, arith_mean, geo_mean; printf( \n ); do printf( ); scanf( %lf, &v

ポインタ変数

02: 変数と標準入出力

文字数は1~6なので 同じ本数の枝を持つパスで生成される呪文の長さは最大で6 倍の差がある 例えば 上図のようなケースを考える 1サイクル終了した時点では スター節点のところに最強呪文として aaaaaac が求まる しかしながら サイクルを繰り返していくと やがてスター節点のところに aaaaaa

Taro-2分探索木Ⅱ(公開版).jtd

Microsoft PowerPoint - algo ppt [互換モード]

ohp03.dvi

Transcription:

第 4 回基本データ構造 1 明星大学情報学科 2 3 年前期 アルゴリズムとデータ構造 Ⅰ 第 4 回 Page 1 配列 スタック キューとその操作 4-1. 配列とその操作 配列型 同じ型の変数を並べたもの 配列にする型は 基本型 配列型 構造体 ポインタいずれでもよい 要素の並べ方を 次元 という 1 次元配列 ( 直線状 ) 2 次元配列 ( 平面状 ) 3 次元配列 ( 立体状 ) a[5] a[4][5] a[3][4][5] a[2][3][4][5] 表 4-1 配列の次元 要素の場所を示すものを 添え字 ( インデックス ) という [1/10]

4-2. スタックとその操作 4-2-1. スタック (stack) 明星大学情報学科 2 3 年前期 アルゴリズムとデータ構造 Ⅰ 第 4 回 Page 2 データの追加 取り出しともに最後 ( 最近 ) のデータで行なう 最初に追加したものを最後に取り出すので FILO(First In Last Out) と表現したり 最後に追加したものを最初に取り出すので LIFO(Last In First Out) と表現したりする 日常でのイメージ レポートを書く わからないことに遭遇 調べ物をする メール着信 メールを読む 電話着信 電話をする スタック ( 作業の一時退避場所 ) メール 調べ物 調べ物 調べ物 レポートレポートレポートレポートレポート 4-2-2. スタックを実現するデータ構造 スタックポインタ : 最後に積まれているデータの場所を指し示すポインタ スタックエリア : スタックとして使用する空間 ( メモリの場所 ) [2/10]

4-2-3. スタックへの追加 明星大学情報学科 2 3 年前期 アルゴリズムとデータ構造 Ⅰ 第 4 回 Page 3 スタックへデータを追加する操作は 積む PUSH する 退避する 載せる と表現されることもある スタックに を追加する操作 スタックポインタ 元のデータ をこれから積む場所を指すように更新する の場所へ を入れる 4-2-4. スタックからの取り出し スタックからデータを取り出す操作は 降ろす POP する 復帰する と表現されることもある スタックから取り出す操作 スタックポインタ 元のデータ の場所からデータを取り出す を次に取り出す場所へ更新する [3/10]

4-3. キューとその操作 4-3-1. キュー (queue) 明星大学情報学科 2 3 年前期 アルゴリズムとデータ構造 Ⅰ 第 4 回 Page 4 データの追加は最後 ( 最近 ) 取り出しは先頭 ( 最古 ) のデータで行なう 最初に追加したものを最初に取り出すので FIFO(First In First Out) と表現したり 何かの順番を待って並んでいる列のようなので待ち行列と表現したりする 日常でのイメージ レジ 列の先頭からレジにつく 列の最後尾に並ぶ 4-3-2. キューを実現するデータ構造 E F G 読み出しポインタ データを取り出す位置を示す 書き込みポインタ データを追加する位置を示す はデータを取り出すごとに右に移動する はデータを追加するごとに右に移動する データがない場合 ( 空の場合 ) と は同じ場所を指し キューは 下図のようになる [4/10]

4-3-3. リングバッファ 明星大学情報学科 2 3 年前期 アルゴリズムとデータ構造 Ⅰ 第 4 回 Page 5 キューバッファとして確保した領域で 格納する場所が最後の位置まで来たとき 次の格納場所をキューバッファの先頭にすることで 効率よく使用できる このように バッファの末尾と先頭をつないで連続させたものを リングバッファ という n 0 n-1 1 E F G リングバッファ リングバッファによるキュー 4-3-4. キューへの追加 キューへデータを追加する操作は enqueue( エンキュー ) と表現されることもある キューに を追加する操作 元のデータ の場所へ を入れる を次の場所へ更新する [5/10]

4-3-5. キューからの取り出し 明星大学情報学科 2 3 年前期 アルゴリズムとデータ構造 Ⅰ 第 4 回 Page 6 キューからデータを取り出す操作は dequeue( デキュー ) と表現されることもある キューから取り出す操作 元のデータ の場所からデータを取り出す を次の場所へ更新する [6/10]

4-4.ppendix 明星大学情報学科 2 3 年前期 アルゴリズムとデータ構造 Ⅰ 第 4 回 Page 7 4-4-1. 配列操作のプログラム array.c #include <stdio.h> #define T_SIZE 10 /* データを格納する配列のサイズ */ #define LST_T (T_SIZE - 1) /* 配列の最後 */ unsigned char g_array[t_size+1]; /* データを格納する配列の宣言 */ /* +1 は この例のプログラムで終端記号を入れるために追加 */ void init( void ); void insert( int insert_point, unsigned char data ); void delete( int delete_point ); int main( void ) printf( " 0123456789\n" ); init(); printf( "init %s\n", g_array ); insert( 3, '' ); printf( "insert 3,'' %s\n", g_array ); insert( 4, '' ); printf( "insert 4,'' %s\n", g_array ); insert( 5, '' ); printf( "insert 5,'' %s\n", g_array ); insert( 4, '' ); printf( "insert 4,'' %s\n", g_array ); insert( 6, 'E' ); printf( "insert 6,'E' %s\n", g_array ); delete( 5 ); printf( "delete 5 %s\n", g_array ); delete( 6 ); printf( "delete 6 %s\n", g_array ); insert( 6, 'F' ); printf( "insert 6,'F' %s\n", g_array ); delete( 2 ); printf( "delete 2 %s\n", g_array ); insert( 7, 'G' ); printf( "insert 7,'G' %s\n", g_array ); insert( 7, 'H' ); printf( "insert 7,'H' %s\n", g_array ); insert( 7, 'I' ); printf( "insert 7,'I' %s\n", g_array ); return ( 0 ); void insert( int insert_point, unsigned char data ) int i; for ( i = LST_T ; i > insert_point ; i-- ) g_array[i] = g_array[i-1]; /* データの移動 */ g_array[insert_point] = data; /* データ挿入 */ void delete( int delete_point ) int i; for ( i = delete_point ; i < LST_T ; i++ ) g_array[i] = g_array[i+1]; /* データの移動 */ void init( void ) /* 初期データの登録 */ int i; for ( i = 0 ; i < T_SIZE ; i++ ) g_array[i] = '.'; /* すべての領域を '.' で埋める */ g_array[lst_t+1] = '\0'; /* 最後を文字列終端記号に設定する */ [7/10]

明星大学情報学科 2 3 年前期 アルゴリズムとデータ構造 Ⅰ 第 4 回 Page 8 4-4-2. スタック操作のプログラム stack.c #include <stdio.h> #include <stdlib.h> #define STK_SIZE 10 /* スタックのサイズ */ struct stack /* スタック管理の構造体定義 */ unsigned char *sp; /* スタックポインタ */ int remain; /* スタックの残量 */ ; struct stack stack_memory; /* スタック管理の構造体宣言 */ unsigned char *g_stack_limit; /* この例のプログラムでスタックを表示するために追加 */ void push( unsigned char data ); unsigned char pop( void ); void init( void ); int main( void ) unsigned char data; printf( " 0123456789\n" ); init(); printf( "init %s\n", g_stack_limit ); push( '' ); printf( "push '' %s\n", g_stack_limit ); push( '' ); printf( "push '' %s\n", g_stack_limit ); push( '' ); printf( "push '' %s\n", g_stack_limit ); push( '' ); printf( "push '' %s\n", g_stack_limit ); data = pop(); printf( "pop %s pop data=%c\n", g_stack_limit, data ); data = pop(); printf( "pop %s pop data=%c\n", g_stack_limit, data ); push( 'E' ); printf( "push 'E' %s\n", g_stack_limit ); data = pop(); printf( "pop %s pop data=%c\n", g_stack_limit, data ); return ( 0 ); void push( unsigned char data ) if ( stack_memory.remain > 0 ) /* スタック残量があれば */ stack_memory.sp--; /* スタックポインタ更新 */ *(stack_memory.sp) = data; /* データを追加 */ stack_memory.remain--; /* スタック残量を減らす */ unsigned char pop( void ) unsigned char data; if ( stack_memory.remain < STK_SIZE ) /* スタックの底でなければ */ data = *(stack_memory.sp); /* データを取り出す */ *(stack_memory.sp) = '.'; /* この例のプログラムでデータの取り出しを明示するために追加 */ stack_memory.sp++; /* スタックポインタ更新 */ stack_memory.remain++; /* スタック残量を増やす */ else data = '\0'; /* スタックが空なら返すデータを空にする */ return ( data ); void init( void ) /* スタックメモリの確保と初期設定 */ unsigned char *tmp; stack_memory.sp = malloc( sizeof(unsigned char) * STK_SIZE + 1 ); /* スタックメモリの確保 */ /* +1 は この例のプログラムで終端記号を入れるために追加 */ [8/10]

明星大学情報学科 2 3 年前期 アルゴリズムとデータ構造 Ⅰ 第 4 回 Page 9 tmp = g_stack_limit = stack_memory.sp; /* この例のプログラムでスタックの内容を初期化するために追加 */ stack_memory.remain = STK_SIZE; /* スタックの残量初期化 */ stack_memory.sp += STK_SIZE; /* スタックポインタ初期化 */ while ( tmp!= stack_memory.sp ) /* この例のプログラムでスタックの内容を初期化 */ *tmp++ = '.'; /* すべての領域を '.' で埋める */ *tmp = '\0'; /* 最後を文字列終端記号に設定する */ 4-4-3. キュー操作のプログラム queue.c #include <stdio.h> #include <stdlib.h> #define QUEUE_SIZE 10 /* キューのサイズ */ struct queue unsigned char *; /* 読み出しポインタ */ unsigned char *; /* 書き込みポインタ */ unsigned char *top; /* キューバッファの先頭 */ unsigned char *end; /* キューバッファの末尾 */ int remain; /* キューの残量 */ ; struct queue queue_buffer; /* キュー管理の構造体宣言 */ void enqueue( unsigned char data ); unsigned char dequeue( void ); void init( void ); int main( void ) unsigned char data; printf( " 0123456789\n" ); init(); printf( "init %s\n", queue_buffer.top ); enqueue( '' ); printf( "enqueue '' %s\n", queue_buffer.top ); enqueue( '' ); printf( "enqueue '' %s\n", queue_buffer.top ); enqueue( '' ); printf( "enqueue '' %s\n", queue_buffer.top ); enqueue( '' ); printf( "enqueue '' %s\n", queue_buffer.top ); data = dequeue(); printf( "dequeue %s dequeue data=%c\n", queue_buffer.top, data ); data = dequeue(); printf( "dequeue %s dequeue data=%c\n", queue_buffer.top, data ); enqueue( 'E' ); printf( "enqueue 'E' %s\n", queue_buffer.top ); enqueue( 'F' ); printf( "enqueue 'F' %s\n", queue_buffer.top ); enqueue( 'G' ); printf( "enqueue 'G' %s\n", queue_buffer.top ); enqueue( 'H' ); printf( "enqueue 'H' %s\n", queue_buffer.top ); data = dequeue(); printf( "dequeue %s dequeue data=%c\n", queue_buffer.top, data ); data = dequeue(); printf( "dequeue %s dequeue data=%c\n", queue_buffer.top, data ); data = dequeue(); printf( "dequeue %s dequeue data=%c\n", queue_buffer.top, data ); enqueue( 'I' ); printf( "enqueue 'I' %s\n", queue_buffer.top ); enqueue( 'J' ); printf( "enqueue 'J' %s\n", queue_buffer.top ); enqueue( 'K' ); printf( "enqueue 'K' %s\n", queue_buffer.top ); enqueue( 'L' ); printf( "enqueue 'L' %s\n", queue_buffer.top ); enqueue( 'M' ); printf( "enqueue 'M' %s\n", queue_buffer.top ); return ( 0 ); [9/10]

明星大学情報学科 2 3 年前期 アルゴリズムとデータ構造 Ⅰ 第 4 回 Page 10 void enqueue( unsigned char data ) if ( queue_buffer.remain > 0 ) /* キュー残量があれば */ *(queue_buffer.) = data; /* データを追加 */ if ( queue_buffer. == queue_buffer.end ) /* 書き込みポインタ更新 */ queue_buffer. = queue_buffer.top; else queue_buffer.++; queue_buffer.remain--; /* キュー残量を減らす */ unsigned char dequeue( void ) unsigned char data; if ( queue_buffer.!= queue_buffer. ) /* キューが空でなければ */ data = *(queue_buffer.); /* データを取り出す */ *(queue_buffer.) = '.'; /* この例のプログラムでデータの取り出しを明示するために追加 */ if ( queue_buffer. == queue_buffer.end ) /* 読み出しポインタ更新 */ queue_buffer. = queue_buffer.top; else queue_buffer.++; queue_buffer.remain++; /* キュー残量を増やす */ else data = '\0'; /* キューが空なら返すデータを空にする */ return ( data ); void init( void ) /* キューバッファの確保と初期設定 */ unsigned char *tmp; queue_buffer.top = malloc( sizeof(unsigned char) * QUEUE_SIZE + 1 ); /* キューバッファの確保 */ /* +1 は この例のプログラムで終端記号を入れるために追加 */ queue_buffer.end = queue_buffer.top + (QUEUE_SIZE -1); /* キュー末尾ポインタ設定 */ queue_buffer.remain = QUEUE_SIZE; /* キューの残量初期化 */ queue_buffer. = queue_buffer.top; /* 読み出しポインタ初期化 */ queue_buffer. = queue_buffer.top; /* 書き込みポインタ初期化 */ tmp = queue_buffer.top; while ( tmp!= queue_buffer.end ) /* この例のプログラムでスタックの内容を初期化 */ *tmp++ = '.'; /* すべての領域を '.' で埋める */ *tmp++ = '.'; *tmp = '\0'; /* 最後を文字列終端記号に設定する */ [10/10]