美文网首页
数据结构——队列

数据结构——队列

作者: JsCoderr | 来源:发表于2018-05-02 11:05 被阅读0次

定义

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

队列是一种先进先出的线性表。允许插入的一端称为队尾,允许删除的一端称为队头。

如下图所示:

这里写图片描述

循环队列

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

队列顺序存储的不足

假设有一个队列有n个元素,则顺序存储的队列需要建立一个大于n的数组,并把队列的所有元素存储在数组的前n个单元,数组下标为0的一端即是队头。所谓的入队操作,其实就是在队尾追加一个元素,不需要移动任何元素,因此世家复杂度为O(1)。

这里写图片描述

与栈不同的是,队列元素的出队是在队头,即下标为0的位置,也就意味着,队列中的所有元素都得向前移动,也就是下标为0的位置不为空,时间复杂度为O(n).

这里写图片描述

它们的具体实现和线性表的顺序存储结构是一样的,不再累赘。

但是

如果不去限制队列的元素必须存储在数组的前n个单元这一条件,出队的性能就会大大增加,如图

这里写图片描述

为了避免只有一个元素时,队头和队尾重合使得处理变得麻烦,就引入两个指针,front指向队头元素,rear指向队尾元素的下一个位置,这样当front等于rear时,表示空队列。

这样又出现一个问题,如果队尾已有元素,再插入新元素时rear指向哪里?而且,当队列中只有队尾有元素时,向后再加,就会产生数组越界错误,可实际上之前的位置可能有空,我们把这种现象叫做假溢出

循环队列定义

解决假溢出的办法就是后面满了,就再从头开始,也就是头尾相接的循环。我们把队列的这种头尾相接的顺序存储结构称为循环队列。

下标2、3、4位置已有元素,在插入新元素,则存放下标为0的位置。如图:

这里写图片描述

但之前约定当front==rear时,表示队列为空,上述方法中front==rear时还表示队列已满,怎么处理呢?

我们要求,队列满时,数组中还有一个空闲单元,如图:

这里写图片描述

得出以下公式:

  • 队列满 的条件(rear+1)%QueueSize==front

  • 队列长度公式:(rear-front+QueueSize)%QueueSize

队列的链式存储

队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们简称为链队列。

这里写图片描述

空队列时,front和rear都指向头节点:

这里写图片描述

入队操作

这里写图片描述
  1. 将最后一个元素后继指向新元素;
  2. 将尾指针指向新元素。

出队操作

这里写图片描述
  1. 将头结点的后继改为后面一位结点;
  2. 若除头节点外只剩一个元素时,将rear指向头节点。

总的来说,在可以确定队列长度最大值的情况下,建议用循环队列,如果你无法预估队列的长度时,则用链队列。

更多精彩内容,欢迎关注我的微信公众号——Android机动车

这里写图片描述

相关文章

  • 看图说话数据结构之二项队列(优先队列)——原理解析

    数据结构之二叉堆(优先队列)——原理解析,数据结构之二叉堆(优先队列)——java实现,数据结构之左式堆(优先队列...

  • MQ(message queue)

    是什么? 1.什么是队列? 队列是一种先进先出的数据结构。 数据结构 线性数据结构:常用的:线性表、栈、队列、串等...

  • 数据结构-队列(Queue)-FIFO

    数据结构-队列(Queue)-FIFO 队列的接口设计 双端队列-Deque 循环队列-CircleQueue 双...

  • Java数据结构和算法概览

    Java数据结构和算法概览 数据结构 线性数据结构:常见的有一维数组,线性表,栈,队列,双队列,串。 非线性数据结...

  • 刷穿剑指offer-Day20-队列I 队列的使用与基础题型!

    队列的介绍 队列(queue)是一种简单、常用的数据结构,在上一章栈的学习中,我们已经提到了队列这种数据结构。 队...

  • AQS源码浅析(6)——条件队列

    一、ConditionObject数据结构 简单回顾条件队列的数据结构,一个单链表。 条件队列只有在独占模式下才能...

  • C++数据结构探险——队列篇

    数据结构的原理 队列:先进先出(FIFO:first in first out) 普通队列: 环形队列: 以C++...

  • Handler精讲

    讲解本技术点之前需要准备的技术点回顾 队列数据结构 数据结构-队列(queue) - CSDN博客 Java中的T...

  • Queue

    什么是队列?队列是数据结构中比较重要的一种类型(是一种数据结构),它支持 FIFO,尾部添加、头部删除(先进队列的...

  • 队列

    队列 队列数据结构 队列是遵循FIFO (First In First Out, 先进先出, 也称先来先服务) 原...

网友评论

      本文标题:数据结构——队列

      本文链接:https://www.haomeiwen.com/subject/umwqrftx.html