接触C语言那么久了,相信大家多多少少会接触到“栈”的概念。对于新手来说可能只是略有耳闻,并没有太深入去了解它。今天相当于给大家捋一捋“栈”的概念和相关的一些知识点,小白可以当预习,大牛可以......看看就好。
提到“栈”,就不能不提到我们在内存管理中提到的虚拟内存VM中的“栈空间”(没印象的朋友可以翻我前面一篇文章把内存管理理解好,C语言真的不难学。今天带你“攻破”内存管理)。为什么它要叫“栈空间”,就是因为这个空间具有“栈”的逻辑特性。
卖了那么久关子,那栈是个啥东西?又有什么特性?
栈的基本概念
栈是一种逻辑结构,是特殊的一种线性。特殊在于:
只能在固定的一端操作只要满足上述条件,那么这种特殊的线性表就会呈现一种“后进先出”的逻辑,这种逻辑就被称为栈。栈在生活中到处可见,比如堆叠的盘子、电梯中的人们、嵌套函数的参数等等。
由于约定了只能在线性表固定的一端进行操作,于是给栈这种特殊的线性表的“插入”、“删除”,另起了下面这些特定的名称:
栈顶:可以进行插入删除的一端
栈底:栈顶的对端
入栈:将节点插入栈顶之上,也称为压栈,函数名通常为push()
出栈:将节点从栈顶剔除,也称为弹栈,函数名通常为pop()
取栈顶:取得栈顶元素,但不出栈,函数名通常为top()
基于这种固定一端操作的简单约定,栈获得了“后进先出”的基本特性,如下图所示,最后一个放入的元素,最先被拿出来。(就好比说吃完饭之后洗碗,一个碗洗干净后会叠到另外一个碗上面,当你全部都洗好了就会把碗一个个放入到消毒柜里面,这时候拿的碗总是在顶部的那个。)
栈的实际运用
所谓“栈”只是一种数据逻辑,那如何把“栈”为我们而用来存放数据呢?讲道理在日常嵌入式开发中这种数据结构比较少用,如果需要用到这种数据结构,我们通常会用链式存储的形式形成所谓链式。
链式栈的组织形式与链表无异,只不过插入删除被约束在固定的一端。为了便于操作,通常也会创建所谓管理结构体,用来存储栈顶指针、栈元素个数等信息
链式栈结点设计
初始化
入栈
出栈
关于“栈”就先给大家介绍那么多,有不清楚的朋友欢迎