k:特殊的线性表—队列
队列的概念:
队列是另一种特殊的线性表,它的特殊性体现在其只允许在线性表的一端插入数据元素,在线性表的另一端删除数据元素(一般会采用在线性表的表尾那端(没被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:特殊的线性表—队列的更多相关文章
- 数据结构——线性表——队列(queue)
队列也是一种特殊的线性表,它的特点是先入先出(FIFO,即first in first out).它的意思也很直观,想象一下排队买票,先排的人先买(插队是不对的,所以别去想).它也是很常用的数据结构, ...
- Java学习笔记(2)----散列集/线性表/队列/集合/图(Set,List,Queue,Collection,Map)
1. Java集合框架中的所有实例类都实现了Cloneable和Seriablizable接口.所以,它们的实例都是可复制和可序列化的. 2. 规则集存储的是不重复的元素.若要在集合中存储重复的元素, ...
- [PHP] 数据结构-线性表的顺序存储结构PHP实现
1.PHP中的数组实际上是有序映射,可以当成数组,列表,散列表,字典,集合,栈,队列,不是固定的长度2.数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了3.想要函数的一个参数 ...
- 第三章 线性表(C#实现)
1.线性表 概念::零个或多个数据元素的有序序列. 描述: 2.线性表的抽象数据类型: ADT线性表 Data:线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType. ...
- 线性表——顺序表的实现与讲解(C++描述)
线性表 引言 新生安排体检,为了 便管理与统一数据,学校特地规定了排队的方式,即按照学号排队,谁在前谁在后,这都是规定好的,所以谁在谁不在,都是非常方便统计的,同学们就像被一条线(学号)联系起来了,这 ...
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- 线性表 及Java实现 顺序表、链表、栈、队列
数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...
- [置顶] ※数据结构※→☆线性表结构(queue)☆============队列 顺序存储结构(queue sequence)(八)
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的 ...
- [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)
循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). ...
随机推荐
- Drupal 远程命令执行漏洞(CVE-2018-7600)
名称: Drupal 远程命令执行漏洞 CVE-ID: CVE-2018-7600 Poc: https://paper.seebug.org/578/ EXPLOIT-DB: https://www ...
- su: Authentication failure 的解决方案
原因是:ubuntu默认不允许使用root登录,因此初始root账户是不能使用的,需要在普通账户下利用sudo权限修改root密码. 解决方案很简单:设置一个root密码就行了.注意是sudo 而不是 ...
- DataList用法总结
设计模版: 页眉<HeaderTemplate> </HeaderTemplate> 页脚<FooterTemplate> </FooterTemplat ...
- P4382 [八省联考2018]劈配
题目链接 题意分析 受到了\(olinr\ \ julao\)的影响 写了匈牙利算法 首先 我们对于每一个人 从高到低枚举志愿 如果当前志愿的老师有剩余的话 那么我们就选 否则的话 我们看看谁的那个志 ...
- leetcode-733-Flood Fill
题目描述: An image is represented by a 2-D array of integers, each integer representing the pixel value ...
- day3.python 学习之列表
python中列表用[ ]表示, list = [ ] #表示一个空列表 1.list = [ 'A','B','C',‘D’] print(list[0]) # 表示打印出列表中的第一个元素,列表 ...
- WebGIS简单实现一个区域炫酷的3D立体地图效果
1.别人的效果 作为一个GIS专业的,做一个高大上的GIS系统一直是我的梦想,虽然至今为止还没有做出一个理想中的系统,但是偶尔看看别人做的,学习下别人的技术还是很有必要的.眼睛是最容易误导我们的,有时 ...
- 认识CSS中标题引入icon图标
前端之HTML,CSS(十一) icon图标 icon图标的使用 获取网站的中标题icon图标,以京东为例:在域名后添加/favicon.ico Enter打开 鼠标右键,图标另存为下载icon图标, ...
- basic algorithm- 20190416-20190425
binary search 14.https://www.lintcode.com/problem/first-position-of-target/description 74.https://ww ...
- CKEditor图片上传实现详细步骤(使用Struts 2)
本人使用的CKEditor版本是3.6.3.CKEditor配置和部署我就不多说. CKEditor的编辑器工具栏中有一项“图片域”,该工具可以贴上图片地址来在文本编辑器中加入图片,但是没有图片上传. ...