C言語アルゴリズム-スタック |
1 スタック(2)
2つの整数値をスタックする。[pushpop2.c]
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: |
#include <stdio.h> #include <stdlib.h> #define STACK_MAX 20 /* スタックサイズ */ #define STACK_OK 0x8000 /* スタック成功を表すデータ */ #define STACK_FULL STACK_OK + 1 /* スタックサイズを超えたときのデータ */ #define STACK_END STACK_OK + 2 /* スタックの終わりを表すデータ */ /* 構造体定義(ユーザデータ型) */ struct for_next{ /* FOR - NEXT の行番を格納 */ int for_l; int next_l; }; /* 関数のプロトタイプ宣言 */ int push(struct for_next); /* スタックにデータを積む関数 */ struct for_next pop(void); /* スタックからデータを取り出す関数 */ void print_stack(void); /* スタックの内容をすべて表示する関数 */ /* グローバル変数 */ struct for_next stack[STACK_MAX]; /* スタック領域 [0] - [19] */ int stack_pointer = 0; /* スタックポインタ */ void main(void) { int data1[10] = { 1,2,3,4,5,6,7,8,9,10 }; int data2[10] = { 10,20,30,40,50,60,70,80,90,100 }; int x; struct for_next n; char buff[80]; for(x = 0; x < 10; ++x){ printf("%d,%d整数をスタックに積む\n", data1[x], data2[x]); n.for_l = data1[x]; n.next_l = data2[x]; push(n); /* データをスタックに積む */ print_stack(); printf("Hit RETURN key "); gets(buff); } while(1){ n = pop(); /* スタックから取り出し */ if(n.for_l == STACK_END){ printf("スタックデータ終了 \n"); break; } printf("%d %d\n", n.for_l, n.next_l); } printf("\n"); } int push(struct for_next d) { if(stack_pointer >= STACK_MAX) /* スタックポインタが最大 */ return(STACK_FULL); /* STACK_FULLを返す */ stack[stack_pointer].for_l = d.for_l; /* スタックにデータ格納 */ stack[stack_pointer].next_l = d.next_l; /* スタックにデータ格納 */ ++stack_pointer; /* スタックポインタに1加算 */ return(STACK_OK); /* STACK_OKを返す */ } struct for_next pop(void) { if(stack_pointer == 0){ /* スタックポインタが0 */ stack[stack_pointer].for_l = STACK_END; return(stack[stack_pointer]); } --stack_pointer; /* スタックポインタから1減算 */ return(stack[stack_pointer]); /* スタックのデータを返す */ } void print_stack(void) { int i; for(i = stack_pointer - 1; i >= 0; --i) printf("%4d %4d", stack[i].for_l, stack[i].next_l); printf("\n"); } |
2つの整数値をスタックに格納するため、9〜12行目で新しいデータ型を定義している。int x; と宣言すると、xという名前のint型データが格納できる領域が確保される。同じように新しく定義した型でstruct for_next x;と宣言すると、xのfor_lとxのnext_lという2つのint型データが格納できる領域が確保される。
int x; → xだけ
struct for_next x → x.for_l と x.next_l
「xのfor_l」の「の」に当たる文字が.(ピリオド)である。
新しいデータ型を宣言するのに、いちいち「struct 何々」と長々と入力するのは大変である。
次の資料では、typedefというデータ型に別の名前を付けることができる文を使って、少し見やすく整理する。
typedef 元の型 別の型名
別の型名には、#define同様、英大文字を使用することが多い。
例えば、typedef char FLAG; と記述すると、以降、FLAG x; というようにFLAGを型宣言子として使用できる。
次に、typedefを使用したプログラムリストを示す。
Copyright © 2001 Hiroshi Masuda |