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). ...
随机推荐
- django model改变后,同步数据库
在使用django进行开发时,往往需要根据不同的需求对model进行更改.而这时候,python manage.py syncdb就不好使了. 目前有个很好的工具,是south,这个是专门用来更改mo ...
- css效果小计
在工作学习中总能发现一些新鲜的页面效果可以用不同的css完成,在这里将遇到的一些css做下记录,以便日后翻阅,如果其中的写法不对,或者有更优写法欢迎留言,不胜感激 1.关于用一个div做出双边框(由于 ...
- Hibernate 工具类
1.HibernateConfigUtil.java(HIbernate配置工具类) import org.hibernate.Session; import org.hibernate.Sessio ...
- python学习,day4:生成器,通过yield实现单线程情况下的并发运算
首先了解一个斐波那契函数的实现,了解下生成器的工作流程 # coding=utf-8 # Author: RyAn Bi def fib(max): n,a,b=0,0,1 while n < ...
- hiho# 1394最小路径覆盖 网络流拆点
题目传送门 思路: 观察到路径上除了终点起点以外的每个点出度和入度都为1,和网络流的拆点很像,所以就把每个点都拆成两个点,若存在一条路径$(u,v)$,则建一条$(u,v+n,1)$的边,然后求出最大 ...
- 论文分享NO.3(by_xiaojian)
论文分享第三期-2019.03.29 Fully convolutional networks for semantic segmentation,CVPR 2015,FCN 一.全连接层与全局平均池 ...
- 2019.04.11 第四次训练 【 2017 United Kingdom and Ireland Programming Contest】
题目链接: https://codeforces.com/gym/101606 A: ✅ B: C: ✅ D: ✅ https://blog.csdn.net/Cassie_zkq/article/ ...
- 剑指offer——面试题29:顺时针打印矩阵
#include"iostream" #include"stdio.h" using namespace std; void PrintMatrixInCirc ...
- spring boot快速入门 4: jpa数据库操作 实现增删改查
spring boot jpa逆向生成表 简单实例: 第一步:pom文件: <?xml version="1.0" encoding="UTF-8"?&g ...
- tomcat无法登录
最近开始学JEE,在配置环境时,使用了tomcat 7.x的版本,然而点击manager app时无法登录. 按照网络上的教程(如:http://www.oschina.net/question/19 ...