【C言語版】シーケンシャルテーブルによるスタックの実装
データ構造ではスタックは重要な概念の一つであるが,C言語では対応するデータ構造はない.これは多分スタックの構造が簡単すぎるからです.
シーケンステーブル、またはチェーンテーブルでスタックを実現できます.
スタックでは、スタックに入る、スタックを出る、スタックトップ要素を取るという3つの基本的な操作があります.それ以外に、スタックを初期化するべきです(初期化はプログラミングの中で重要な習慣で、プログラミングをしないでください)
最初はexternでグローバル変数を定義し、mallocでメモリ空間を開くことを考えていましたが、実際の過程で、外部でグローバル変数を定義するとコードの可読性が低下することに気づきました.実際に使用するときにグローバル変数を忘れましょう.そこで最後にInitでシーケンステーブルを定義する.
スタックのインスタックアウト、スタックトップ要素を取ります.
シーケンステーブル、またはチェーンテーブルでスタックを実現できます.
スタックでは、スタックに入る、スタックを出る、スタックトップ要素を取るという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;
}