C言語アルゴリズム-スタック
前へ 目次へ 次へ 

1 スタック(3)

構造体定義にtypedefで別名を付けて使用する。[pushpop.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     /* スタックの終わりを表すデータ */
/* 構造体定義(ユーザデータ型) */
typedef struct for_next{        /* FOR - NEXT の行番を格納 */
    int     for_l;
    int     next_l;
}FOR_NEXT;
/* 関数のプロトタイプ宣言 */
int         push(FOR_NEXT);     /* スタックにデータを積む関数 */
FOR_NEXT    pop(void);          /* スタックからデータを取り出す関数 */
void        print_stack(void);  /* スタックの内容をすべて表示する関数 */
/* グローバル変数 */
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;
    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(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を返す */
}
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");
}
9〜12行の構造体定義は、次のように書いても良い。
   9: typedef struct {        /* FOR - NEXT の行番を格納 */
  10:     int     for_l;
  11:     int     next_l;
  12: }FOR_NEXT;
定義以降のプログラム中でstruct for_nextを使用しないので構造体のタグ名for_nextを省略することができる。


前へ 目次へ 次へ 
Copyright © 2001 Hiroshi Masuda 

 

 

inserted by FC2 system