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 

 

 

inserted by FC2 system