【C言語版】シーケンシャルテーブルによるスタックの実装


データ構造ではスタックは重要な概念の一つであるが,C言語では対応するデータ構造はない.これは多分スタックの構造が簡単すぎるからです.
シーケンステーブル、またはチェーンテーブルでスタックを実現できます.
スタックでは、スタックに入る、スタックを出る、スタックトップ要素を取るという3つの基本的な操作があります.それ以外に、スタックを初期化するべきです(初期化はプログラミングの中で重要な習慣で、プログラミングをしないでください)
   
#include 
#include 
#define 100 MAX;

typedef char StackType;
//extern StackType *data = (StackType*)malloc(sizeof(StackType));
typedef struct Stack{
        StackType* st;
        size_t size;
}Stack;
void StackInit(Stack* stack,StackType* base){//     
    if (stack == NULL)
        return;
    stack->size = 0;
    stack->st = (StackType *)malloc((sizeof(StackType) * 100));
    base = stack->st;
    return;
}

最初はexternでグローバル変数を定義し、mallocでメモリ空間を開くことを考えていましたが、実際の過程で、外部でグローバル変数を定義するとコードの可読性が低下することに気づきました.実際に使用するときにグローバル変数を忘れましょう.そこで最後にInitでシーケンステーブルを定義する.
スタックのインスタックアウト、スタックトップ要素を取ります.
Stack* StackDestroy(Stack* stack,StackType* base){//  
    if (stack == NULL)
        return NULL;
    stack->size = 0;
    free(base);
    return NULL;
};
Stack* StackPush(Stack* stack,StackType value,StackType* base){//  
    if (stack == NULL)
        return NULL;
    if (stack->size == MAX){
           realloc(base,MAX*2);
    }
    stack->size++;
    stack->st++;
    *(stack->st) = value;
    return stack;
};
Stack* StackPop(Stack* stack){//  
    if (stack == NULL)
        return NULL;
    stack->size--;
    stack->st--;
    return stack;
}
StackType* StackTop(Stack* stack){//     
    if (stack == NULL)
        return NULL;
    return stack->st;
}