用动图详细讲解——栈

这篇具有很好参考价值的文章主要介绍了用动图详细讲解——栈。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

栈的概念:


栈:

一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作,是操作受到限制的线性表,遵行后进先出LIFO(Last In First Out)的原则。

简单理解就是一个一端封口,另一端没有封口的管子,你往里面放直径与管子的直径相同的球,不管你放多少球,你先取的一定是最后放的球,最里面的球要把前面的球全部取出来才能取到。这个管子里的空间就相当于栈的空间就相当于你所要放入栈的数据
栈顶,数据结构和算法,数据结构,算法,c语言,栈,线性表


栈顶和栈底

进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,非空栈中的栈顶指针始终在栈顶元素的下一个位置上,空栈时,栈顶指针和栈底指针指向同一块位置。

借助管子和球的例子,简单理解就是管子封口那里就是栈底,管子中最外层的球的下一个可以存放球的空间,但还没有存放球的位置就是栈顶,不能直接理解为管口就是栈顶。

栈顶,数据结构和算法,数据结构,算法,c语言,栈,线性表

当管子中没有球时(空栈),栈顶和栈底所指向的位置相等,都指向管子最里面所能存放一个球的空间

栈顶,数据结构和算法,数据结构,算法,c语言,栈,线性表


压栈和出栈

栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶,栈的删除操作叫做出栈。出数据也在栈顶。

入栈gif动画
栈顶,数据结构和算法,数据结构,算法,c语言,栈,线性表
出栈gif动画栈顶,数据结构和算法,数据结构,算法,c语言,栈,线性表


栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾部插入数据的代价比较小,可以根据下标直接锁定尾部。
用链表(无头单向非循环链表)在尾部插入数据的代价比较大,需要先遍历一遍才能找到尾部,但也不是不可以,不过尽量用数组比较好一些。

对于栈的实现,有这几个功能,

  1. 初始化栈
  2. 检测栈的容量是否充足(不充足进行扩容)
  3. 入栈
  4. 出栈
  5. 获取栈顶元素
  6. 获取栈中有效元素个数
  7. 检测栈是否为空(为空返回非0结果,不为空返回0)
  8. 销毁栈

我们将用函数对这些功能进行封装


用结构体自定义一个栈的数据类型
// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{
   
	STDataType* a;
	int top;		// 栈顶
	int capacity;  // 容量 
}Stack;

因为我们不知道存放在栈中的数据的类型,所以将存放数据的类型用typedef重命名为STDataType,以方便随时更改。(这里我们存放数据的类型是int

Stack就是我们定义并重命名的栈的数据类型
STDataType* a指向栈用数组存放数据的地方起始位置,即栈底
top是栈顶,也是用来访问数组尾部的下标
capacity是栈的容量,指栈所能容纳多少的数据


初始化栈
void StackInit(Stack* ps)
{
   
	assert(ps);
	ps->a = NULL;
	ps->top = ps->capacity = 0;
}

将栈的地址传过来,对其成员进行初始化

assert(ps)对传过来的地址进行空指针的判断,因为传过来的地址不能为空
ps->a = NULL将指针为空,表明栈的容量为0
ps->top = ps->capacity = 0top记录栈顶位置,capacity记录栈的容量,当容量不足时(也就是ps->top == ps->capacity)进行扩容文章来源地址https://www.toymoban.com/news/detail-783612.html


检测栈的容量是否充足(不充足进行扩容)
void CheckCapacity(Stack* ps)
{
   
	assert(ps);//传过来的指针不能为空
	
	if (ps->top =

到了这里,关于用动图详细讲解——栈的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】快排的详细讲解

    江河入海,知识涌动,这是我参与江海计划的第7篇。 目录:         快排是排序算法中效率是比较高的,快排的基本思想是运用二分思想,与二叉树的前序遍历类似,将数据划分,每次划分确定1个基准值(就是已经确定好有序后位置的数据),以升序为例,基准值左面的数据

    2024年02月06日
    浏览(84)
  • 《数据结构》八大排序(详细图文分析讲解)

    目录 排序 排序的应用       排序简介 排序的分类 排序算法的好坏评判 冒泡排序法  思路分析 代码实现   选择排序法 思路分析 代码实现   插入排序 思路分析 代码实现  希尔排序 思路分析 代码演示  归并排序法  思路分析 代码演示  快速排序  思路分析 代码实现 

    2024年02月03日
    浏览(40)
  • 数据结构(超详细讲解!!)第十八节 串(堆串)

    假设以一维数组heap MAXSIZE 表示可供字符串进行动态分配的存储空间,并设 int start 指向heap 中未分配区域的开始地址(初始化时start =0) 。在程序执行过程中,当生成一个新串时,就从start指示的位置起,为新串分配一个所需大小的存储空间,同时建立该串的描述。这种存储

    2024年02月05日
    浏览(49)
  • C++数据封装以及定义结构的详细讲解鸭~

    名字:阿玥的小东东   博客主页:阿玥的小东东的博客_CSDN博客-pythonc++高级知识,过年必备,C/C++知识讲解领域博主 目录 定义结构 访问结构成员 结构作为函数参数

    2024年02月04日
    浏览(34)
  • 数据结构进阶篇 之【选择排序】详细讲解(选择排序,堆排序)

    民以食为天,我以乐为先 嘴上来的嘘寒问暖,不如直接打笔巨款 1.1 基本思想 1.2 实现原理 1.3 代码实现 1.4 直接选择排序的特性总结 跳转链接:数据结构 之 堆的应用 –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀–❀–❀

    2024年04月09日
    浏览(34)
  • 【数据结构】动图详解双向链表

    目录 1.单向链表的劣势 2.带头双向循环链表         1.逻辑结构        2.结点的代码实现 3.双向链表接口的实现         1.接口1---初始化         2.接口2,3---头插,尾插         3. 接口4,5---头删,尾删         3. 接口6---查找          4. 接口7,8--插入,

    2024年01月23日
    浏览(51)
  • 【数据结构】动图详解单向链表

    目录 1.什么是链表         1.问题引入         2. 链表的概念及结构         3. 问题解决 2.单向链表接口的实现         1.接口1,2---头插,尾插         2. 接口3,4---头删,尾删         3. 接口5---查找          4. 接口6,7---插入,删除         5. 接口

    2024年01月18日
    浏览(50)
  • 数据结构——七大排序[源码+动图+性能测试]

    本章代码gitee仓库:排序 我们日常打扑克牌,摸牌,让后将牌按顺序插入好,这其实就是插入排序的过程,打小插入排序的思想就植入我们的脑海 第一张牌不用管,直接拿在手里,之后的牌按照大小再一个一个插入即可 直接插入排序特性: 越接近有序,效率越高(不用那么多

    2024年02月09日
    浏览(42)
  • 数据结构进阶篇 之 【插入排序】详细讲解(直接插入排序,希尔排序)

    千万不要因为一件事不会做而失去信心,你又不是只有这一件事不会,你还有很多呢 1.1 基本思想 1.2 实现原理 1.3 代码实现 1.4 直接插入排序的特性总结 2.1 基本思想 2.2 实现原理 2.3 代码实现 2.4希尔排序的特性总结 –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–

    2024年04月12日
    浏览(64)
  • 数据结构(超详细讲解!!)第二十一节 特殊矩阵的压缩存储

    值相同的元素只存储一次 压缩掉对零元的存储,只存储非零元 特殊形状矩阵: 是指非零元(如值相同的元素)或零元素分布具有一定规律性的矩阵。 如: 对称矩阵 上三角矩阵   下三角矩阵 对角矩阵   准对角矩阵 三角矩阵大体分为三类:下三角矩阵、上三角矩阵和对称

    2024年02月04日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包