队列的概念:

 队列是另一种特殊的线性表,它的特殊性体现在其只允许在线性表的一端插入数据元素,在线性表的另一端删除数据元素(一般会采用在线性表的表尾那端(没被head指针所指的那端)插入数据元素,在线性表的表头(被head指针所指的那端)那端删除数据元素,因为按照此种方式进行操作的队列,无论采用的是顺序存储方式的物理结构还是链式存储方式的物理结构,其插入和删除数据元素的时间复杂度为O(1))。所以队列是一种操作受限的特殊的线性表,它具有先进先出(First In First Out,FIFO)或(Last In Last Out,LILO)的特性。

 运行进行插入的一端称为队尾(rear),运行进行删除的一端成为队首(front)。队列的插入操作通常成为入队操作,而删除操作通常称为出队操作。

队列的相关API(java):

public interface Queue<T>
{
public abstract void clear();//清空
public abstract boolean isEmpty();//判空
public abstract int length();//求长度
public abstract T peek();//取队首元素
public abstract void offer(T x)throws Exception;//入队
public abstract T poll();//出队
}

 同栈一样,队列也有顺序和链式两种存储结构。顺序存储结构的队列称为顺序队列,链式存储结构的队列称为链队列。

顺序队列:

 对于顺序队列,采用数组的方式进行实现,在实现类中维护两个int型变量front和rear(一般而言int型够用了)用于记录队首的索引值和队尾的下一个存储单元的索引值,其值随着入队和出队的操作而发生改变。但是,由于采用数组的方式对队列进行实现,所以,其可能会发生“假溢出”的情况,所谓的“假溢出”即是因顺序队列的多次入队和出队操作后出现有存储空间,但是不能进行入队操作的溢出现象。

 要解决“假溢出”问题,最好的办法就是把顺序队列所使用的存储空间看成一个逻辑上首尾相连的循环顺序队列。但是对于循环顺序队列而言,其需要考虑的一个问题是出现了判空和判满的条件均为front==rear的情况,要解决判空和判满的条件均为front==rear的情况,有三种解决的办法。

第一种:

采用少用数组中的一个存储单元的方式,当顺序存储空间的容量为maxSize时,只允许最多存放maxSize-1个数据元素。此时,队空的判断条件为front==rear,而队满的判断条件为:front==(rear+1)%maxSize

第二种:

采用设置一个boolean型标识变量flag的方法,设其初始化值为false;当入队操作成功后就置该标识为true;每当出队操作成功后,就置为false;则此时队空的判断条件为:front==rear&&!flag,而队满的判断条件为:front==rear&&flag

第三种:

采用设置一个计数器的方式,在实现队列的过程中,引入一个计数变量num,其初始化值为0,每当入队操作成功后,就将计数变量num的值加一;每当出队操作成功后,就将计数变量num的值减一,则此时队空的判断条件为:num==0,队满的判断条件为:num>0&&front==rear

 采用以上任何一种解决循环顺序队列判空和判满条件相同的,计算其队列中元素个数的时候,均可以使用(rear-front+maxSize)%maxSize的计算方式计算出队列的长度,其中maxSize为数组的长度。

ps:

 由于队列的实现可以在线性表的实现之上进行修改,从而得到相关的值,为此,不在此处进行实现。对于顺序队列而言,其API中相关的方法的实现其时间复杂度均为O(1)。对于链队列,其API中相关的方法的实现,其时间复杂度也均为O(1)。关于链队列和顺序队列的孰优孰劣的比较,个人认为和顺序表和链表的相同,可以参考:顺序表和链表的比较

 对于链队列,其在java中相关的实现为Queuequeue=new LinkedList();其中,T为泛型(Queue接口和LinkedList类均在java.util包中)

 对于顺序队列,其在java中相关的实现为Queue queue=new ArrayList();其中,T为泛型(Queue接口和ArrayList类均在java.util包中)

对于队列,其有一个重要的变形,就是优先队列,对于优先队列,其也是队列的一种,也满足队列的相关API,但是,优先队列不满足先进先出的特点,因为优先队列在插入数据元素的时候,其不是限定在队尾进行插入的,而是顺序插入到队列的合适的位置,以确保队列的优先顺序,同时,优先队列也可以采用顺序和链式两种存储结构。一般而言,在考虑到优先队列中,既要保证快速的访问到优先级高的数据元素,又要保证可以较快的实现插入操作,所以通常以链式存储结构来实现优先队列。

对于优先队列的实现,这里进行省略。在java中,优先队列的实现类为PriorityQueue,其相关的使用及其事例,参见java中PriorityQueue优先级队列使用方法

回到目录|·(工)·)

k:特殊的线性表—队列的更多相关文章

  1. 数据结构——线性表——队列(queue)

    队列也是一种特殊的线性表,它的特点是先入先出(FIFO,即first in first out).它的意思也很直观,想象一下排队买票,先排的人先买(插队是不对的,所以别去想).它也是很常用的数据结构, ...

  2. Java学习笔记(2)----散列集/线性表/队列/集合/图(Set,List,Queue,Collection,Map)

    1. Java集合框架中的所有实例类都实现了Cloneable和Seriablizable接口.所以,它们的实例都是可复制和可序列化的. 2. 规则集存储的是不重复的元素.若要在集合中存储重复的元素, ...

  3. [PHP] 数据结构-线性表的顺序存储结构PHP实现

    1.PHP中的数组实际上是有序映射,可以当成数组,列表,散列表,字典,集合,栈,队列,不是固定的长度2.数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了3.想要函数的一个参数 ...

  4. 第三章 线性表(C#实现)

    1.线性表 概念::零个或多个数据元素的有序序列. 描述: 2.线性表的抽象数据类型: ADT线性表 Data:线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType. ...

  5. 线性表——顺序表的实现与讲解(C++描述)

    线性表 引言 新生安排体检,为了 便管理与统一数据,学校特地规定了排队的方式,即按照学号排队,谁在前谁在后,这都是规定好的,所以谁在谁不在,都是非常方便统计的,同学们就像被一条线(学号)联系起来了,这 ...

  6. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    //归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...

  7. 线性表 及Java实现 顺序表、链表、栈、队列

    数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...

  8. [置顶] ※数据结构※→☆线性表结构(queue)☆============队列 顺序存储结构(queue sequence)(八)

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的 ...

  9. [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)

    循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). ...

随机推荐

  1. mxonline实战5,用户注册的验证码

        github对应地址:验证码好麻烦     一. 安装 配置 1. pip install django-simple-captcha 2. add captcha to the INSTAL ...

  2. C++多线程编程一

    1.C++多线程初步: #include <iostream> #include <thread> #include <Windows.h> using names ...

  3. package.json和bower的参数解释

    package.json和bower的参数解释   一.package.json解释: package.json是用来声明项目中使用的模块,这样新的环境部署时,只要在package.json文件所在的 ...

  4. 【3】JMicro微服务-服务超时,重试,重试间隔

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 接下来的内容都基于[2]JMicro微服务-Hello World做Demo 微服务中,超时和重试是一个最基本问题下面Dem ...

  5. web环境中的spring MVC

    1. web.xml文件的简单详解 在web环境中, spring MVC是建立在IOC容器的基础上,要了解spring mvc,首先要了解Spring IOC容器是如何在web环境中被载入并起作用的 ...

  6. C#-WebForm-JS知识:基础部分、BOM部分、DOM部分、JS事件

    一.基础部分: 1.JavaScript 是什么? 是一门脚本语言,是属于弱类型(语言语法很随意),C#是强类型(语言语法非常严格)(李献策lxc) 优点:JS 执行速度快 2.JS 与java有什么 ...

  7. keycloak ssl-required报错问题处理

       两台主机,网段不同,第一台129.30.108.179/24    第二台172.16.160.92/24 都安装keycloak :    docker run -d --name keycl ...

  8. video.js 应用于网站需要视频的

    http://www.cnblogs.com/lechenging/p/3858181.html

  9. vue进行路由拼图的使用案例

    实现思路,利用路由进行实现多个组件拼图: Detail.vue <template> <div> <h1>详细展示</h1> <div>鞍山 ...

  10. 洛谷 P4774 / loj 2721 [NOI2018] 屠龙勇士 题解【同余】【exgcd】【CRT】

    推导过程存在漏洞+exCRT板子没打熟于是期望得分÷实际得分=∞? 题目描述 小 D 最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照编号 \(1\sim n​\) 顺序杀掉 \(n​\ ...