目录
一.栈的基本概念
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端
称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
进栈(压栈):栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈(弹栈):栈的删除操作叫做出栈。出数据也在栈顶
二.栈的基本结构
当插入一个数据的时候,插入成功那么该数据此时就是栈顶元素了
而最先入栈的元素就是栈底元素。
最先入栈的元素被压在栈底,当需要取出元素的时候当然只能先把栈底以上的元素取出后,才能够将栈底的元素取出
三.栈的实现
栈的实现分为两种方式,1.数组实现2.链表实现
这两种实现都有着优缺点吧,但相对而言我觉得数组的实现更优一些,用链表实现每次入栈都需要申请空间和出栈时都需要释放空间,而数组只需要在容量满了的时候扩容,最主要的是数组的物理结构连续的,当计算缓存的时候命中率更高,读取效率也越高。
链表的实现又分为两种方法,一是入栈时尾插,出栈时尾删。二是入栈时头插出栈时头删
相对而言,第二种方法更优一些,因为尾插尾删每次都需要找尾,时间复杂度为O(n),而头删头插不需要找尾,时间复杂度为O(1)
ok,链表实现栈就不再阐述了,今天讲的主要内容为用数组实现栈
数组实现栈,当入栈的时候就像当于我们之前实现顺序表时的尾插,出栈的时候就相当于顺序表的尾删,此时它们的时间复杂度为O(1)
由下面的图可以看到栈底的元素一直为第一个进去的元素,当入栈一个元素的时候,此时栈顶就变为了该元素所在的位置,当出栈一个元素的时候,栈顶就为出的这个元素的前面一个元素了
总结而言栈顶元素实际上就是数组的最后一个元素
数组实现栈用文字已经讲得差不多了,现在让我们开始用代码来实现它吧
1.相关的接口函数
2.定义一个结构体
3.初始化
初始化top==0,此时top表示栈的元素个数,也表示栈顶元素的下一个位置,即【top-1】表示栈顶元素
4.入栈
入栈时需判断栈是否满了,满了就扩容
5.判断栈是否为空
当top为零时表示栈为空
6.出栈
下图获取栈顶元素需断言一下,防止栈为空时,访问data【-1】位置(非法访问)
声明一下出栈是和获取栈顶元素配套使用的,如下图:
此时获取了栈顶元素然后让它出栈
7.获取栈的元素个数
8.栈的销毁
关于栈的知识分享就到这了,觉得有所帮助就点点赞吧,感谢大家的支持,
有什么需要改进的地方希望大家可以指出来
886!