图解数据结构(04) --队列

队列1、什么是队列2、队列的基本操作【1】入队【2】出队循环队列循环队列代码实现3、队列的应用双端队列优先队列1、什么是队列假如公路上有一条单行隧道,所有通过隧道的车辆只允许从隧道入口驶入,从隧道出口驶出,不允许逆行,如下图:因此,要想让车辆驶出隧道,只能按照它们驶入隧道的顺序,先驶入的车辆先驶出,后驶入的车辆后驶出,任何车辆都无法跳过它前面的车辆提前驶出:队列(queue)是一种线性...
摘要由CSDN通过智能技术生成

1、什么是队列

假如公路上有一条单行隧道,所有通过隧道的车辆只允许从隧道入口驶入,从隧道出口驶出,不允许逆行,如下图:
在这里插入图片描述
因此,要想让车辆驶出隧道,只能按照它们驶入隧道的顺序,先驶入的车辆先驶出,后驶入的车辆后驶出,任何车辆都无法跳过它前面的车辆提前驶出:
在这里插入图片描述
队列(queue)是一种线性数据结构,它的特征和行驶车辆的单行隧道很相似;不同于栈的先入后出,队列中的元素只能先入先出(First In First Out,简称 FIFO),队列的出口端叫作队头(front),队列的入口端叫作队尾(rear)。
与栈类似,队列这种数据结构既可以用数组来实现,也可以用链表来实现;
用数组实现时,为了入队操作的方便,把队尾位置规定为最后入队元素的下一 个位置;

  • 队列的数组实现如下图:
    在这里插入图片描述
  • 队列的链表实现如下图:
    在这里插入图片描述

2、队列的基本操作

【1】入队

入队(enqueue)就是把新元素放入队列中,只允许在队尾的位置放入元素, 新元素的下一个位置将会成为新的队尾:
在这里插入图片描述

【2】出队

出队操作(dequeue)就是把元素移出队列,只允许在队头一侧移出元素,出队元素的后一个元素将会成为新的队头:
在这里插入图片描述
**问题:**如果像这样不断出队,队头左边的空间失去作用,那队列的容量岂不是越来越小了?
例如像下面这样:
**解决方案:**用数组实现的队列可以采用循环队列的方式来维持队列容量的恒定

循环队列

假设一个队列经过反复的入队和出队操作,还剩下2个元素,在“物理”上分布于数组的末尾位置。这时又有一个新元素将要入队,如下图:
在这里插入图片描述
在数组不做扩容的前提下,如何让新元素入队并确定新的队尾位置呢?
可以利用已出队元素留下的空间,让队尾指针重新指回数组的首位
在这里插入图片描述
这样一来,整个队列的元素就**“循环”**起来了。在物理存储上,队尾的位置也可以在队头之前;当再有元素入队时,将其放入数组的首位,队尾指针继续后移即可:
在这里插入图片描述
一直到(队尾下标+1)%数组长度 = 队头下标时,代表此队列真的已经满了;需要注意的是,队尾指针指向的位置永远空出1位,所以队列最大容量比数组长度小 1
在这里插入图片描述

循环队列代码实现
pub
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值