スタックとは 複数のデータを、順序付きで記録でき、その出し入れが可能なデータの容れ物 # 入れる順序が変ると、出る順序が変る 新しく追加する物は上に積まれる / 取り出す場合も一番上から +-----------+ | データ | <= 一番上が、最新 +-----------+ +-----------+ | データ | +-----------+ +-----------+ | データ | +-----------+ --------+-----------+----- 棚 新しい物は上に積んでゆく -> どんどん、積み重ねる事により、沢山保持できる (利点:少ないスペースで大量のデータが保持できる) 棚から取り出せるのは一番上の物だけ (欠点:最新のものしか取り出せない) <<比較>> ランダムアクセスメモリ どこでも参照できる(利点) 広い(アドレス)空間が必要(欠点) 特定の場合は便利で 記憶領域の効率的(無駄がなくて、かつ簡単にできる)な記憶方式 スタック操作 push data ; data をスタック(の一番上)に載せる pop ; スタックのトップのデータ取出し、スタックからそのデータを取り除く 「スタック」は、「pushd/popができるもの」として認識される => 「それが何からできているか/どうやって作られているか ?」には興味がない 「それがどのように扱えるか ?」にしか興味がない (オブジェクト指向) -> 抽象データ型 スタックでは、 最初に入れた物 ( First In ) が、最後に出て来る ( Last Out ) ので FILO と呼ぶ # cf. FIFO ( First In First Out ) は Queue (行列) [結論] スタックは、便利で、良く出てくる考え == C 言語でも、スタックが利用されている 関数呼び出しの時に、変数を管理するためにスタックが利用されている p-002.exe の実行結果 sub2: bfc1f32c <- 一回目の sub2 の i のアドレス sub1: bfc1f32c <- ニ回目の sub1 の i のアドレス (一回目の sub2 と同じ) sub2: bfc1f2fc <- ニ回目の sub2 の i のアドレス (一回目と違う) [結論] C の(auto)変数は、スタック上に作られる == 多分岐構文 switch 文 状況 一つの変数 ( int 型 [か、char 型..] ) の値によって、 多数の選択肢の一つを実現したい場合を考える 事例 : トランプの位を出力 トランプ (変数 trump) は 1 から 13 の数でカードの位を表すが、 それを表示する場合に.. 1 -> A とする 2 〜 10 -> そのまま 2 〜 10 11 -> J 12 -> Q 13 -> K 解答 A : if 文 ( else if ) を利用する void print_trump ( int trump ) { if ( trump == 1 ) { printf ( "A" ); } else if ( trump == 11 ) { printf ( "J" ); } else if ( trump == 12 ) { printf ( "Q" ); } else if ( trump == 13 ) { printf ( "K" ); } else if ( 2 <= tump && tump <= 10 ) { printf ( "%d", trump ); } else { printf ( "What ???\n" ); } } 解答 B : switch 文を利用する 構文 switch ( 式 ) { case 定数1: /* 式の値 == 定数 1 の時 */ .. case 定数2: /* 式の値 == 定数 2 の時 */ .. default: /* 式の値 == 定数 k の何れともちがう場合 */ } !! break; があると、そこで、switch 文を終了する !! break; がないと、次の case にいってしまう void print_trump ( int trump ) { switch ( trump ) { case 1: /* if ( trump == 1 ) の所 */ printf ( "A" ); break; case 11: printf ( "J" ); break; case 12: printf ( "Q" ); break; case 13: printf ( "K" ); break; default: if ( 2 <= tump && tump <= 10 ) { printf ( "%d", trump ); } else { printf ( "What ???\n" ); } break; } /* さらに .. */ void print_trump ( int trump ) { switch ( trump ) { case 1: /* if ( trump == 1 ) の所 */ printf ( "A" ); break; case 11: printf ( "J" ); break; case 12: printf ( "Q" ); break; case 13: printf ( "K" ); break; case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: printf ( "%d", trump ); break; default: printf ( "What ???\n" ); break; }