スタックにデータを積むことをプッシュ(push)と,スタックからデータを取り出すことを ポップ(pup)と呼ぶ.これらの英語の意味は,
教科書では,カッコの対応を調べるプログラム(p.104-108 List 4-2)や逆ポーランド記法 を用いた数式の計算(p.114-115 List 4-3)が示されている.授業では説明しないので,興 味のある者は自分でソースコードを解析するのが良いだろう.
スタックを実装するために必要な記憶領域は,スタックそのものの記憶領域とスタックの 頂上を表す記憶領域である.スタックのための記憶領域として配列stack[]を使って いる.また,スタックの頂上を表すために,変数stack_topを使っている 2.
スタックのために必要な記憶領域が確保されたならば,それを操作しなくてはならない. スタックに必要な操作は2つで,データを積む(push)ことと,データを取り出す(pop)こと である.リスト1では,次の2つの関数でそれを行っている.
ここで使われているプログラムのテクニックは,すでに学習済みであるが,分かりにくい ものだけ述べておく.
関数exit()は,正常にプログラムを終了させるために使う.これが呼び出される と,諸々の処理を行いプログラムが止まる.ここで使われている引数EXIT_FAILUREの定義 はstdlib.hに書かれている.私のコンパイラーでは,
#define EXIT_FAILURE 1 /* Failing exit status. */
となっていた.したがって,この行は,
exit(1);
と同じである.exit(EXIT_FAILURE);とすると処理系定義の不成功状態の形式が 返される.
1 #define STACK_MAX 10 2 3 /* ※この例では,double型のデータを格納するスタックを作成 */ 4 double stack[STACK_MAX]; 5 /* スタック頂上の位置(最下部からのオフセット) */ 6 int stack_top=0; 7 8 /* スタックへpush */ 9 void stack_push(double val) 10 { 11 if(stack_top==STACK_MAX) 12 { 13 /* スタックが満杯になっている */ 14 printf("エラー:スタックが満杯です(Stack overflow)\n"); 15 exit(EXIT_FAILURE); 16 } 17 else 18 { 19 /* 渡された値をスタックに積む */ 20 stack[stack_top]=val; 21 ++stack_top; 22 } 23 } 24 25 /* スタックからデータをpop */ 26 double stack_pop(void) 27 { 28 if(stack_top==0) 29 { 30 /* スタックには何もない */ 31 printf("エラー:スタックが空なのにpopが呼ばれました" 32 "(Stack underflow)\n"); 33 exit(EXIT_FAILURE); 34 return 0; 35 } 36 else 37 { 38 /* いちばん上の値を返す */ 39 --stack_top; 40 return stack[stack_top]; 41 } 42 }
[転載について]
このペー
ジ中のリスト1のプログラムは,教科書として使用している以下の書籍
書名 | プログラミングの宝箱 アルゴリズムとデータ構造 ISBN4-7973-2419-8 |
著作者 | 紀平拓男・春日伸弥 |
出版社 | ソフトバンク パブリッシング株式会社 |