スタックにデータを積むことをプッシュ(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 |
| 著作者 | 紀平拓男・春日伸弥 |
| 出版社 | ソフトバンク パブリッシング株式会社 |