算法|不会有人2022年还不懂栈吧()

算法|不会有人2022年还不懂栈吧()
文章图片
,我又来了。
注意、注意 这可能是你目前为止看到的最细节的关于线性表中的栈的博文了
所以,一定要认真学哦!!!
学完之后,你肯定能学会栈的。要是学不会,就多看几遍啦!
一定要坚持看完,一分耕耘一分收获哦算法|不会有人2022年还不懂栈吧()
文章图片

算法|不会有人2022年还不懂栈吧()
文章图片
1.栈的概念及结构
算法|不会有人2022年还不懂栈吧()
文章图片
2.栈的实现
算法|不会有人2022年还不懂栈吧()
文章图片
3.代码的实现
1.栈的概念及结构
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除 操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out) 的原则。
注:栈就跟枪膛一样,先进的后发射,后进的先发射
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶
注:压栈,出栈它们都是在栈顶进行操作

压栈:
算法|不会有人2022年还不懂栈吧()
文章图片


出栈:
算法|不会有人2022年还不懂栈吧()
文章图片

总之大家一定要记住入栈,出栈都是在栈顶操作,它们都满足一个特征都是后进先出
2.栈的实现
栈的实现一般可以使用顺序表(数组)或者链表实现,相对而言顺序表的结构实现更优一些。因为顺序表在尾上 插入数据的代价比较小。
顺序存储:
算法|不会有人2022年还不懂栈吧()
文章图片


链式存储:
算法|不会有人2022年还不懂栈吧()
文章图片


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 #include #include #includetypedef 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个STDataType这么大的空间,如果开辟成功就把这个开辟空间的首地址赋给ps->a,ps->capacity记录当前空间的大小,ps->top栈中元素个数
销毁栈:
//销毁 void StackDestory(ST* ps) { assert(ps); free(ps->a); ps->a = NULL; ps->top = ps->capacity = 0; }

直接用free释放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; }

ps->top就是栈中元素的个数,因为是按数组进行存储的下标从0开始,所以ps->top就是元素个数
【算法|不会有人2022年还不懂栈吧()】判断栈是否为空:
//判断栈是否为空 bool StackEmpty(ST* ps) { assert(ps); return ps->top == 0; }

ps->top==0它就代表着空
你们有get到吗???
算法|不会有人2022年还不懂栈吧()
文章图片

算法|不会有人2022年还不懂栈吧()
文章图片
QQ:2186529582???

    推荐阅读