寒假关于数据结构学习笔记(四)

栈的链式存储结构

讲完了栈的顺序存储结构,我们现在来看看**栈的链式存储结构,简称为链栈。**想想看,栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那千吗不让它俩合二为一-呢,所以比较好的办法是把栈顶放在单链表的头部,如图所示。在这里插入图片描述
另外,都已经有了栈顶在头部了,单链表中比较常用的头结点也就失去了意义,通常对于链栈来说,是不需要头结点的。

对于链栈来说,基本不存在栈满的情况,除非内存已经没有可以使用的空间,如果真的发生,那此时的计算机操作系统已经面临死机崩溃的情况,而不是这个链栈是否溢出的问题。

但对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是top=NULL的时候。

链栈的结构代码如下:
在这里插入图片描述
在高级语言中,调用自己和其他函数并没有本质的不同。我们把一个直接调用自己或通过一一系列的调用语句间接地调用自己的函数,称做递归函数。
当然,写递归程序最怕的就是陷入永不结束的无穷递归中,所以,**每个递归定义必须至少有一一个条件,满足时递归不再进行,即不再引用自身而是返回值退出。**比如刚才的例子,总有一-次递归会使得i<2的,这样就可以执行return i的语句而不用继续递归了。
栈的常见现实应用:数学表达式的求值。

队列的定义:队列( queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。

队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一一端称为队尾,允许删除的一端称为队头。假设队列是q= ( a1, az, … an),那么a1就是队头元素,而an是队尾元素。这样我们就可以删除时,总是从a1 开始,而插入时,列在最后。这也比较符合我们通常生活中的习惯,排在第一一个的优先出列,最后来的当然排在队伍最后,如图所示。在这里插入图片描述

队列在程序设计中用得非常频繁。比如用键盘进行各种字母或数字的输入,到显示器上如记事本软件上的输出,其实就是队列的典型。
同样是线性表,队列也有类似线性表的各种操作,不同的就是插入数据只能在队尾进行,删除数据只能在队头进行。在这里插入图片描述

线性表有顺序存储和链式存储,栈是线性表,所以有这两种存储方式。同样,队列作为-一种特殊的线性表,也同样存在这两种存储方式。****加粗样式我们先来看队列的顺序存储结构。
队列顺序存储的不足

我们假设-一个队列有n个元素,则顺序存储的队列需建立-一个大于n的数组,并把队列的所有元素存储在数组的前n个单元,数组下标为0的一端即是队头。所谓的入队列操作,其实就是在队尾追加-一个元素,不需要移动任何元素,因此时间复杂度
同样是线性表,队列也有类似线性表的各种操作,不同的就是插入数据只能在队尾进行,删除数据只能在队头进行。

线性表有顺序存储和链式存储,栈是线性表,所以有这两种存储方式。同样,队列作为-一种特殊的线性表,也同样存在这两种存储方式。我们先来看队列的顺序存储结构。

我们假设-一个队列有n个元素,则顺序存储的队列需建立-一个大于n的数组,并把队列的所有元素存储在数组的前n个单元,数组下标为0的一端即是队头。所谓的入队列操作,其实就是在队尾追加-一个元素,不需要移动任何元素,因此时间复杂度为0(1),如图所示。在这里插入图片描述

与栈不同的是,队列元素的出列是在队头,即下标为0的位置,那也就意味着,队列中的所有元素都得向前移动,以保证队列的队头,也就是下标为0的位置不为空,此时时间复杂度为0(n),如图所示。在这里插入图片描述

这里的实现和线性表的顺序存储结构完全相同,不再详述。

在现实中也是如此,- 群人在排队买票,前面的人买好了离开,后面的人就要全部向前一步,补上空位,似乎这也没什么不好。

可有时想想,为什么出队列时一-定要全部移动呢,如果不去限制队列的元素必须存储在数组的前n个单元这一-条件, 出队的性能就会大大增加。也就是说,队头不需要一定在下标为0的位置,如图所示。在这里插入图片描述

为了避免当只有一个元素时,队头和队尾重合使处理变得麻烦,所以引入两个指针,front 指针指向队头元素, rear 指针指向队尾元素的下一一个位置,这样当front等于rear时,此队列不是还剩-一个元素,而是空队列。
假设是长度为5的数组,初始状态,空队列如图4-12-4 的左图所示,front 与rear指针均指向下标为0的位置。然后入队a1、a2\ a3\、 a4, front 指针依然指向下标为0位置,而rear指针指向下标为4的位置,如图所示。在这里插入图片描述

出队a1、a2, 则front指针指向下标为2的位置,rear 不变,如图4-12-5的左图所示,再入队as,此时front指针不变,rear指针移动到数组之外。嗯?数组之外,那将是哪里?如图所示。在这里插入图片描述

问题还不止于此。假设这个队列的总个数不超过5个,但目前如果接着入队的话,因数组末尾元素已经占用,再向后加,就会产生数组越界的错误,可实际上,我们的队列在下标为0和1的地方还是空闲的。我们把这种现象叫做“假溢出”。

现实当中,你上了公交车,发现前排有两个空座位,而后排所有座位都已经坐满,你会怎么做?立马下车,并对自己说,后面没座了,我等下一-辆?

没有这么笨的人,前面有座位,当然也是可以坐的,除非坐满了,才会考虑下一辆。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值