スタックの定義
片方の固定端でのみ要素の挿入と削除を許可する特別な線形テーブル。データの挿入および削除操作の一方の端はスタックの最上位と呼ばれ、もう一方の端はスタックの最下部と呼ばれます。
スタックの基本操作
押す:スタックの挿入操作はプッシュ、プッシュ、プッシュと呼ばれ、スタックにプッシュされたデータはスタックの一番上にあります。
スタックを解除する:スタックの削除操作は、ポップと呼ばれます。ポップされたデータもスタックの一番上にあります。
したがって、リンクリストとシーケンシャルリストを使用してスタックを実装できますが、スタックの構造を考慮すると、削除の終了と挿入の終了操作なので、シーケンステーブルを使用すると便利です。
スタックの実装
C言語シーケンステーブルの実装:
スタックの定義
typedef int Data;
typedef struct stack{
Data* _data;
int _size;
int _capacity;
}stack;
スタックの初期化
void init(stack* stack){
if (stack == NULL){
return;
}
stack->_data = NULL;
stack->_capacity = stack->_size = 0;
}
空(容量増加)
void checkcapacity(stack* stack){
if (stack->_capacity==stack->_size){
int newcapacity = stack->_capacity == 0 ? 1 : stack->_capacity * 2;
stack->_data = (Data*)realloc(stack->_data,sizeof(Data)*newcapacity);
stack->_capacity = newcapacity;
}
}
ポップアンドプッシュ
//入栈(先进后出)(相当于尾插)
void push(stack* stack, Data data){
if (stack == NULL){
return;
}
checkcapacity(stack);
stack->_data[stack->_size] = data;
stack->_size++;
}
//出栈(相当于尾删)
void pop(stack* stack){
if (stack == NULL){
return;
}
if (stack->_size > 0){
stack->_size--;
}
}
トップ要素
//得到栈顶元素
void stacktop(stack* stack){
//如果为空的话返回空,不用判断
return stack->_data[stack->_size - 1];
}
空のスタック
//判断是否为空栈
int empty(stack* stack){
if (stack->_size == 0){
return 1;
}
else if (stack = NULL){
return 1;
}
else{
return 0;
}
}
要素の数を見てください
int size(stack* stack){
if (stack == NULL){
return 0;
}
return stack->_size;
}
破壊
void destory(stack* stack)
{
if (stack == NULL)
{
printf("非法操作\n");
return;
}
stack->_size = 0;
stack->_capicity = 0;
free(stack->_data);//先释放堆空间
stack->_data = NULL;
}