、もう一度戻ります。
これはおそらく、これまでに見た線形リストのスタックに関する最も詳細なブログ投稿であることに注意してください。
だから、必ず一生懸命勉強してください!!!
学んだ後、あなたは間違いなくスタックすることを学ぶことができます。あなたがそれを学ぶことができないならば、それを何度も見てください!
頑張って読んでください、努力は報われません。
1.スタックの概念と構造
2.スタックの実装
3.コードの実装
1.スタックの概念と構造
スタック:一方の固定端でのみ要素の挿入と削除を可能にする特別な線形リスト。データの挿入と削除が実行される一方の端はスタックの最上位と呼ばれ、もう一方の端はスタックの最下部と呼ばれます。スタック内のデータ要素は、 LIFO(後入れ先出し)の原則に従います。
注:スタックは銃室のようなもので、高度なものは後で発射され、最後のものが最初に発射されます。
プッシュスタック:スタックの挿入操作はプッシュ/プッシュ/プッシュと呼ばれ、プッシュされたデータはスタックの最上位にあります。
ポップ:スタックの削除はポップと呼ばれます。送信データもスタックの最上位にあります
注:スタックをプッシュすることとスタックをポップすることはすべて、スタックの一番上で動作します
スタックをプッシュします。
飛び出る:
つまり、誰もがスタックをプッシュして、スタックの一番上にスタックをポップすることを忘れないでください。
2.スタックの実装
スタックの実装は、通常、シーケンステーブル(配列)またはリンクリストを使用して実装できますが、比較的、シーケンステーブルの構造の方が優れています。シーケンシャルテーブルの末尾にデータを挿入するコストは比較的小さいためです。
シーケンシャルストレージ:
チェーンストレージ:
3.コードの実装
test.c:テストファイル
#define _CRT_SECURE_NO_WARNINGS 1
#include"stack.h"
int main()
{
ST st;//定义了一个ST结构体的变量
StackInit(&st);
StackPush(&st, 1);
StackPush(&st, 2);
StackPush(&st, 3);
printf("%d ", StackTop(&st));
StackPop(&st);
StackPush(&st, 4);
printf("%d ", StackTop(&st));
StackPop(&st);
StackPush(&st, 5);
StackPush(&st, 6);
while (!StackEmpty(&st))
{
printf("%d ", StackTop(&st));
StackPop(&st);
}
StackDestory(&st);
return 0;
}
stack.h:ヘッダーファイル
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<stdbool.h>
#include<assert.h>
#include<stdlib.h>
typedef int STDataType;
typedef struct Stack
{
STDataType *a;
int top;//栈顶元素的下标
int capacity;//空间大小
}ST;
//初始化
void StackInit(ST* ps);
//销毁
void StackDestory(ST* ps);
//在栈顶插入(入栈)
void StackPush(ST* ps, STDataType x);
//在栈顶删除(出栈)
void StackPop(ST* ps);
//取栈顶的数据
STDataType StackTop(ST* ps);
//栈的元素
int StackSize(ST* ps);
//判断栈是否为空
bool StackEmpty(ST* ps);
ヘッダーファイルには、ライブラリ関数、型の再定義、構造体の型、およびカスタム関数の宣言が含まれています。
次に、カスタム関数の関数をヘッダーファイルに実装しましょう!!!
先の高エネルギー、気をつけてください、元気を出してください
初期化:
//初始化
void StackInit(ST* ps)
{
assert(ps);
STDataType tmp = (STDataType)malloc(sizeof(STDataType)* 4);
if (tmp == NULL)
{
assert(tmp);
}
ps->a = tmp;
ps->capacity = 4;
ps->top = 0;
}
最初に、最大4つのSTDataTypesのスペースが開かれます。オープンが成功すると、開かれたスペースの最初のアドレスがps-> aに割り当てられ、ps->capacityは現在のスペースのサイズと数を記録します。 ps->トップスタックの要素
スタックを破棄します:
//销毁
void StackDestory(ST* ps)
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->top = ps->capacity = 0;
}
ps-> aを直接無料で解放し、ps->aをNULLにします。
ps-> topps->capacityに要素数とスペースサイズを0まで記録させます
スタックをプッシュします。
//在栈顶插入(入栈)
void StackPush(ST* ps, STDataType x)
{
if (ps->top == ps->capacity)
{
STDataType tmp = realloc(ps->a, ps->capacity*sizeof(STDataType)* 2);
if (tmp == NULL)
{
printf("realloc fail\n");
exit(-1);
}
else
{
ps->a = tmp;
ps->capacity *= 2;
}
}
ps->a[ps->top] = x;
ps->top++;
}
最初にスタックを増やす必要があるかどうかを判断してから、挿入します
飛び出る:
//在栈顶删除(出栈)
void StackPop(ST* ps)
{
assert(ps);
//栈空了,调用Pop,直接中止程序
assert(ps->top);
ps->top--;
}
プッシュとポップはスタックの一番上から実行されます
スタックの最上位要素を取得します。
//取栈顶的数据
STDataType StackTop(ST* ps)
{
assert(ps);
assert(ps->top > 0);
return ps->a[ps->top - 1];
}
まず、スタックにデータがあるかどうかを判断します。データがある場合は、スタックの一番上に直接戻ります。ps-> top == 0の場合、ps->topがスタックの一番上になります。
スタックの要素:
//栈的元素
int StackSize(ST* ps)
{
assert(ps);
return ps->top;
}
配列に格納されている添え字は0から始まるため、ps-> topはスタック内の要素の数であり、ps->topは要素の数です。
スタックが空かどうかを確認します。
//判断栈是否为空
bool StackEmpty(ST* ps)
{
assert(ps);
return ps->top == 0;
}
ps-> top==0それは空を意味します
わかりましたか???