数据结构--队列

队列是一种特殊的线性表,区别在于队列只能在表的尾部(队尾)插入数据(称为入队),从表的头部(队头)删除数据(称为出队),故队列中的元素遵循先进先出(FIFO)的原则。线性表分为顺序存储和链式存储两种存储方式,队列自然也是,顺序存储的队列成为顺序队列,链式存储的队列成为链式队列。

顺序队列

  • 单向列表Queue

顺序队列的存储结构,在顺序队列的存储结构中,根据需要分配一块连续的存储区域来依次存放队列中从队首到队尾的元素。两个指针域,front指向队列队首元素位置,rear指向队尾元素的下一个存储单元,front和rear的初始值都为0.。元素入队或出队时,实时改变头指针和尾指针的位置。当有元素入队时,rear向下标大的方向移动,当元素出队时,队列中的元素不会整体向前移动,而是front向下标大的方向移动。
Queue具体方法如下:

其中插入元素的方法有两种:add(),offer(E e),两者的区别,前者当队列没有可用空间时,会抛出异常,后者不会抛出异常,而是返回false。相比之下后者优于前者。
获取但不移除队列的头:element(),peek(),两者区别:当队列为空时,前者会抛出异常,后者返回null。
获取并移除队列的头:remove(),poll(),前者队列为空时,抛出异常,后者队列为空时,返回null。
一般来说取队列首元素,入队,出队操作都是用peek(),offer(x),poll()这三个方法。

  • “假溢出”&循环顺序队列

队列中不断有元素入队出队,头指针尾指针不断向下标大的方向移动,会出现数组下标越界“假溢出”,队列还有存储空间元素却不能入队。为解决这个问题将队列的头尾相连,逻辑上构成一个环状空间,如此便解决了有存储空间却因数组下标越界而无法入队的问题。
循环队列中当队列为空或者队列已满时,均满足front = rear,那如何区分队列为空还是已满?以下三种方法:
1.统计队列中元素的总的个数count,队列为空时,count = 0,队里已满时,count > 0;
2.设置标志位flag(初始值为0),当元素入队时令flag = 1,当有元素出队时令flag = 0,则若队列为空则flag = 0,当队列已满时,flag = 1.
3.保留一个元素的存储空间,即当队列为空时,front = rear,当队列已满时,rear在front的前一位。

  • 双向队列Deque

单向队列只能在队尾添加元素,从队头删除元素,而双向队列在队头和队尾都可以添加删除元素。
单向队列中的方法双向队列中都有,例如add(E e),此方法在双向队列中为在队尾添加元素。此外基于双向队列的特点,双向队列中还增加了一些其他的方法,例如:addFirst(E e)–在头部添加元素 ,addLast(E e) – 在尾部添加元素。类似add方法,所有单向列表的方法,在双向列表中都存在(功能与单向队列相同),此外单向队列中的方法双向列表中还对应的增加了两种方法(First,Last),此外还有一些其他特有的方法(自行查看API文档)。

  • 优先级队列PriorityQueue

上面讲的队列队列中的元素都是依据入队的先后顺序来排列,优先级队列则不同,优先级队列中每个元素都有优先权,队列中插入的每个数据都带有key值(Kay,data),优先级队列中的元素按照元素的优先级(key值)排列。
对优先级队列操作,与单向列表相似,不同之处在于:1.插入数据时,优先级队列会根据key值将元素插入到对应位置,若元素优先级相同,则根据先入先服务元素排列。2.查找(获取)元素,删除元素,单向列表都是对头元素进行操作,而优先级队列中头元素是队列中优先级最高的元素,故优先级队列的获取、删除操作都是对最高级别元素进行操作。

链式队列

上面顺序队列是用数组实现,链式队列特点与顺序队列相似,不同在于是用链表来完成。

队列的使用

Queue与List和Set是同一级别的,都继承了Collection接口
图片来自于https://blog.csdn.net/qq_42166409/article/details/81481212
最常用的LinkedList,继承了Deque(Deque继承了Queue),非阻塞

		Queue<String> queue = new LinkedList<String>();//单向
		Deque<String> deque = new LinkedList<String>();//双向

注:接口 对象名 = new 类名();实例化对象只能调用接口中的方法,不能调用类中特有的方法。
(阻塞:当队列已满或者为空时,进行入队或者出队操作需要等待
非阻塞:不等待
故:非阻塞时,建议用poll(),offer(x)方法)
此外阻塞队列BlockingQueue继承该接口的五个类
非阻塞AbstractQueue继承该接口的两个类
<<上述具体使用方法后续介绍>>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值