【数据结构与算法】——第四章:队列


 ============================ 【说明】 ===================================================
  大家好,本专栏是 数据结构与算法该科目是计算机类专业必修课之一,比较重要也比较基础,有想从事算法研究的同学,这些内容是专/本科、甚至硕士期间较为基础的内容,适用范围较广:大学专业课学习、考研复习等。
  通过自己的理解进行整理,希望大家积极交流、探讨,多给意见。后面也会给大家更新其他一些知识。若有侵权,联系删除!共同维护网络知识权利!

1、队列的定义

  **队列(queue)**是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
  :再比如像移动、联通、电信等客服电话,客服人员与客户相比总是少数,在所有的客服人员都占线的情况下,客户会被要求等待,直到有某个客服人员空下来,才能让最先等待的客户接通电话。这里也是将所有当前拨打客服电话的客户进行了排队处理。
客服系统中,应用了一种数据结构来实现刚才提到的先进先出的排队功能,这就是队列。
  队列的特点:先进先出(后进后出)

在这里插入图片描述

2、队列的存储

2.1 队列的顺序存储

  队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设指针 Front 和 Rear 分别指示队头元素和队尾元素的位置。
  设队头指针 Front 指向队头元素,队尾指针 Rear 指向队尾元素的下一个位置(或者设队头指针 Front 指向队头元素的下一个位置,队尾指针 Rear 指向队尾元素)。

  进队操作:队不满时,先送值到队尾元素,再将队尾指针加1。base[rear]<-- 元素; rear++;
  出队操作:队不空时,先取队头元素值,再将队头指针加1。base[front]出;front++;
在这里插入图片描述
  我们假设一个队列有n个元素,则顺序存储的队列需建立一个大于n的数组,并把队列的所有元素存储在数组的前n个单元,数组下标为0的一端即是队头。所谓的入队列操作,其实就是在队尾追加一个元素,不需要移动任何元素。

在这里插入图片描述

  与栈不同的是,队列元素的出列是在队头,即下标为0的位置,那也就意味着,队列中的所有元素都得向前移动,以保证队列的队头,也就是下标为0的位置不为空

在这里插入图片描述
  这里的实现和线性表的顺序存储结构完全相同。

  在现实中也是如此,一群人在排队买票,前面的人买好了离开,后面的人就要全部向前一步,补上空位,似乎这也没什么不好。
  可有时想想,为什么出队列时一定要全部移动呢,如果不去限制队列的元素必须存储在数组的前n个单元这一条件,出队的性能就会大大增加。也就是说,队头不需要一定在下标为0的位置。

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

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

在这里插入图片描述
  问题还不止于此。假设这个队列的总个数不超过5个,但目前如果接着人队的话,因数组末尾元素已经占用,再向后加,就会产生数组越界的错误,可实际上,我们的队列在下标为0和1的地方还是空闲的。我们把这种现象叫做“假溢出“
  现实当中,你上了公交车,发现前排有两个空座位,而后排所有座位都已经坐满,你会怎么做?立马下车,并对自己说,后面没座了,我等下一辆?
  这边则涉及到循环队列

2.1 队列的链式存储

在这里插入图片描述
在这里插入图片描述
  空队列时,front和rear都指向头结点:
在这里插入图片描述
  入队操作时,其实就是在链表尾部插人结点:
在这里插入图片描述
  出队操作时,就是头结点的后继结点出队,将头结点的后继改为它后面的结点,若链表除头结点外只一个元素时,则需将rear指向头结点。
在这里插入图片描述

3、循环队列

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、双端队列

  双端队列是指两端都可以进行入队和出队操作的队列,其元素逻辑结构仍为线性结构,将双端队列的两端分别称为前段和后端。

在这里插入图片描述
  注意:在双端队列进队时,前端进的元素排列在队列后端进的元素的前面;在出队时,无论是前段出队还是后端出队,先出的元素排在后出的元素的前面。

  (1) 输出受限的双端队列
  允许在一端进行插入和删除,但在另一端只允许插入的双端队列.
在这里插入图片描述
  (2) 输入受限的双端队列
  允许在一端进行插入和删除,但在另一端只允许删除的双端队列。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cqy阳

预祝上岸,感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值