😎博客昵称:博客小梦
😊最喜欢的座右铭:全神贯注的上吧!!!
😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!
😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘
前言🙌
哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,手把手带领大家详解C语言动态实现顺序栈~ 要是为了运用所学的链表的相关知识和算法。用代码来实现顺序栈,也就是用数组来实现栈。都是精华内容,可不要错过哟!!!😍😍😍
预备小知识💞
栈的概念及结构
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端
称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
整体实现内容分析💞
栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。顺序栈的设计思想是用数组,相比于静态数组,动态数组来设计的话会更加灵活一点。然后还是和链表那样实现栈的基本功能,这里就不赘述了。
1.头文件编码实现🙌
头文件的编写的整体思路分析:
其实大致的实现和链栈差不多,这里先定义一个栈的结构体,用typedef给结构体和数据类型取别名,然后就是各种功能函数的声明,和上述链表差不多。
#include<stdio.h> #include<assert.h> #include<stdbool.h>#include<stdlib.h> typedef int StDatetype; typedef struct StackNode { StDatetype* a; StDatetype top; StDatetype capacity; }ST; //初始化 void StackInit(ST*ps); //销毁 void StackDestory(ST* ps); //入栈 void StackPush(ST* ps, StDatetype x); //出栈 void StackPop(ST* ps); //栈上的数据个数 int StackSize(ST* ps); //栈顶元素 StDatetype StackTop(ST* ps); bool StackEmpty(ST*ps); void StackPrint(ST* ps);
2.功能文件编码实现🙌
功能文件的编写的整体思路分析:
这里是功能函数的实现,需要注意的地方和编写的算法和链栈实现差不多。只是用数组实现的话,在扩容上不够灵活,会产生空间浪费的问题。为了减少空间浪费,这里采用动态数组,扩容时采用增加2倍,比较合理的申请空间。然后就是要通过画图,来帮助自己理清指针的指向,需要注意的是free掉指针后一定要将指针置为NULL,不然会造成野指针的问题。
#include"Stack.h" //初始化 void StackInit(ST* ps) { assert(ps); ps->a = NULL; ps->capacity = 0; ps->top = 0; } //销毁 void StackDestory(ST* ps) { assert(ps); free(ps->a); ps->a = NULL; ps->capacity = ps->top = 0; } //入栈 void StackPush(ST* ps, StDatetype x) { assert(ps); if (ps->top == ps->capacity) { StDatetype newnode = ps->capacity == 0 ? 4 : ps->capacity * 2; StDatetype* temp = (StDatetype*)realloc(ps->a, sizeof(StDatetype)*newnode); if (temp == NULL) { printf("realloc fail\n"); exit(-1); } ps->a = temp; ps->capacity = newnode; } ps->a[ps->top] = x; ps->top++; } //出栈 void StackPop(ST* ps) { assert(ps); assert(!StackEmpty(ps)); ps->top--; } //栈上的数据个数 int StackSize(ST* ps) { assert(ps); return ps->top; } //栈顶元素 StDatetype StackTop(ST* ps) { assert(ps); assert(!StackEmpty(ps)); return ps->a[ps->top - 1]; } bool StackEmpty(ST* ps) { return ps->top == 0; } void StackPrint(ST* ps) { while (!StackEmpty(&ps)) { printf("%d", StackTop(&ps)); StackPop(&ps); } printf("\n"); }
3.测试文件的编写:🙌
#include"Stack.h" void StackTest() { ST st; StackInit(&st); StackPush(&st, 1); StackPush(&st, 2); StackPush(&st, 3); StackPush(&st, 4); printf("栈的输出\n"); while (!StackEmpty(&st)) { printf("%d", StackTop(&st)); StackPop(&st); } StackDestory(&st); } int main() { StackTest(); return 0; }
功能测试结果展示图:
总结撒花💞
本篇文章旨在分享详解C语言实现动态版顺序栈。希望大家通过阅读此文有所收获!😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘