常见的八种数据结构之堆栈

下面我们来看一下堆栈(也称作栈),先看一下官方的解释:

栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。

我们现在来翻译一下官方语言,首先栈是一种特殊的线性表,那我们首先来看一下什么是线性表。
线性表:
线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
线性表分为链式存储和顺序存储,是不是有些熟悉,顺序存储就是用数组来实现的,而链式存储就是用链表实现的。
那我们的栈就是线性表的一种,比较特殊,特殊在什么地方呢?
就是它的实现《先进先出的功能》
堆栈既然是线性表,那我猜它一定有两种形式,为什么是两种呢?线性表就分为两种啊!!!
堆栈分为顺序栈和链式栈,顺序栈就是用数组实现,而链式栈是用链表实现。
那他们有什么区别呢?我们说一下最明显的,那就是地址问题,顺序存储地址连续,链式存储不连续。好理解吧,跟数组与链表的最明显的区别一样一样的。

下面我们看一下这两种是怎么实现的吧!
先看顺序栈吧
一 它是用一个顺序表和一个栈顶指针实现的,重点哟!!!
常见的八种数据结构之堆栈

二 顺序表中,用top指针指示栈顶元素在顺序栈中的位置,用stack[top]存储栈顶元素,当top=0时表示栈为空。
常见的八种数据结构之堆栈

三 栈的初始化操作:设置top的值为0,即top=0。

常见的八种数据结构之堆栈

四 一个stack[m]栈只能存储m-1个元素。

常见的八种数据结构之堆栈

五 进栈操作:当栈没有满时,stack[++top]=x。
常见的八种数据结构之堆栈

六 出栈操作:当栈不为空时,x=stack[top–],注意执行出栈操作时要保证栈中有元素。
常见的八种数据结构之堆栈

这里面可能会有很多疑问,我们来解释一下!!!
其实大家不要想复杂了,这不就是一个一维数组吗???
最底下的是数组的起始元素,我只不过不操作它,我就在数组的末尾进行插入和删除操作,不就是进栈和出栈操作吗?
那top是什么呢?
其实就是一个变量,它用来记录当前栈顶元素在数组中的位置,我们称为栈顶指针。

好,我们下面说第二中链式存储!!
大家如果上面的能懂,那这个就很简单了,我们上面说顺序存储和链式存储的主要区别是什么?没错就是地址的连续问题。
链式栈你可以把我们上面的每个
常见的八种数据结构之堆栈

想象成用链子连在一起的,既然是连在一起的,那地址肯定不连续。
其余的操作都没什么区别的,我这里呢就不详细说了,无非是操作对象换成了结点罢了。

那么堆栈有什么用呢?
首先至少可以存储数据把,然后呢举一个典型的例子!!很典型哟
没错,就是递归的实现。

递归过程是一种调用自身的函数,在调用的过程中存在转入子程序的过程。在每次转子前需要保护现场,则将相应参数和中间结果压入系统堆栈,而在子程序返回的时候,需要恢复现场,则将之前压栈的数据从系统堆栈弹出,因此,递归过程存在隐含的堆栈操作,而且子程序的调用过程满足堆栈先进后出的特性。
当然不知有递归哟,我们以后就会知道的(其实我也不知道还有什么,慢慢来把)。

我们还是从根据时间复杂度分析一下堆栈的主要操作。
出栈:直接从栈顶出去,不用找,时间复杂度是O(1).
入栈:一样,直接进去就行(当然还有判断)时间复杂度O(1)。
是不是很快?空间复杂度呢我们就不看了,因为它还是线性表嘛。
最后留一个练习题:
常见的八种数据结构之堆栈

很经典的一道题。

相关文章: