Queue

stack、queue、priority_queue、deque STL 阅读详情

Queue是一个提供队列服务的集合。除实现了Collection的操作以外,队列还提供插入、提取和检查操作。一般情况下队列是FIFO的,但是也有一些特殊队列,如:优先队列就是依据提供的比较器或是按照自然顺序排列的。不过无论何种队列,其中的数据顺序都是有序的,我们都只可对它的头进行操作。

看到上述对队列的描述,我们发现其实我们也可以使用List或是Set来完成这些功能。其实在java6之前的版本中,我们可以看到LinkedList是实现了Queue接口的,但是从java6开始,增加了Deque(double-end queue),LinkedList的实现更改为了Deque。

Deque(双端队列)可以同时堆头、尾进行操作,在实现了Queue功能的基础上增加了对队列头和尾的操作,并增加了栈的操作。

Queue

数据进出顺序为FIFO,声明了对队列头的插入和检索功能。

AbstractQueue

public abstract class AbstractQueue<E> extends AbstractCollection<E> implements Queue<E> {
	……
}


是Queue的骨干实现。其中add、remove 和 element 方法分别基于 offer、poll 和 peek 方法,但是它们通过抛出异常而不是返回 false 或 null 来指示失败。

PriorityQueue

public class PriorityQueue<E> extends AbstractQueue<E> implements java.io.Serializable{
	……
}


一个基于优先级堆的极大优先级队列。此队列按照在构造时所指定的顺序对元素排序,既可以根据元素的自然顺序 来指定排序,也可以根据 Comparator 来指定,这取决于使用哪种构造方法。优先级队列不允许 null 元素。依靠自然排序的优先级队列还不允许插入不可比较的对象(这样做可能导致 ClassCastException)。

队列的头 是按指定排序方式的最小 元素。如果多个元素都是最小值,则头是其中一个元素——选择方法是任意的。队列检索操作 poll、remove、peek 和 element 访问处于队列头的元素。

数据结构为一个Object数组。并带有自动扩容功能,可以在构造器中设置数组的初始容量,默认为11。

    private void siftUp(int k, E x) {
        if (comparator != null)
            siftUpUsingComparator(k, x);
        else
            siftUpComparable(k, x);
    }

    private void siftUpComparable(int k, E x) {
        Comparable<? super E> key = (Comparable<? super E>) x;
        while (k > 0) {
            int parent = (k - 1) >>> 1;
            Object e = queue[parent];
            if (key.compareTo((E) e) >= 0)
                break;
            queue[k] = e;
            k = parent;
        }
        queue[k] = key;
    }

    private void siftUpUsingComparator(int k, E x) {
        while (k > 0) {
            int parent = (k - 1) >>> 1;
            Object e = queue[parent];
            if (comparator.compare(x, (E) e) >= 0)
                break;
            queue[k] = e;
            k = parent;
        }
        queue[k] = x;
    }


在队列中数据发生变化时,都会对数据进行排序操作,如果有提供了比较器就按照比较器来进行,没有提供就会按照自然排序法进行,但是前提是这些元素是可比较的,即实现了Comparable接口。

Deque

public interface Deque<E> extends Queue<E> {
	……
}


双端队列(double ended queue,发音为‘deck’),是java6以后新增的接口。可以同时堆头、尾进行操作,在实现了Queue功能的基础上增加了对队列头和尾的操作,并增加了栈的操作。

ArrayDeque

public class ArrayDeque<E> extends AbstractCollection<E> implements Deque<E>, Cloneable, Serializable{
	……
}


是由数组实现的双端队列。数组默认的长度为16,每次扩张是都是原大小的二倍。可以通过构造器自行设置大小,但是会通过一次适配,把长度适配为2的次幂。适配方法:

    private void allocateElements(int numElements) {
        int initialCapacity = MIN_INITIAL_CAPACITY;
        // Find the best power of two to hold elements.
        // Tests "<=" because arrays aren't kept full.
        if (numElements >= initialCapacity) {
            initialCapacity = numElements;
            initialCapacity |= (initialCapacity >>>  1);
            initialCapacity |= (initialCapacity >>>  2);
            initialCapacity |= (initialCapacity >>>  4);
            initialCapacity |= (initialCapacity >>>  8);
            initialCapacity |= (initialCapacity >>> 16);
            initialCapacity++;

            if (initialCapacity < 0)   // Too many elements, must back off
                initialCapacity >>>= 1;// Good luck allocating 2 ^ 30 elements
        }
        elements = (E[]) new Object[initialCapacity];
    }


由于是双端队列,所以需要维护2个index,分别为head和tail。

    public void addFirst(E e) {
        if (e == null)
            throw new NullPointerException();
        elements[head = (head - 1) & (elements.length - 1)] = e;
        if (head == tail)
            doubleCapacity();
    }
    public void addLast(E e) {
        if (e == null)
            throw new NullPointerException();
        elements[tail] = e;
        if ( (tail = (tail + 1) & (elements.length - 1)) == head)
            doubleCapacity();
    }


由上代码可以看到,首先是不支持null对象的。head在维护时顺时针处理,tail逆时针处理。如果它们指向同一个位置时就要扩张数组。从这里我们就可以看到为什么我们要求数组的长度必须为2的次幂了,为了位运算,呵呵,觉得这里Josh Bloch and Doug Lea有些取巧了。head指向当前的头数据的位置,tail指向下一个尾数据的位置,这个要切记,否则上面的代码必定要出错。

从api中可以看到,当这个类当做一个stack使用时,运行速度要快于Stack类;当做queue使用时要快于LinkedList的。这个也是同它的数据结构关联的,毕竟对于数组来说检索永远是线性时间。

    public E pollFirst() {
        int h = head;
        E result = elements[h]; // Element is null if deque empty
        if (result == null)
            return null;
        elements[h] = null;     // Must null out slot
        head = (h + 1) & (elements.length - 1);
        return result;
    }


如果我们要移除一个头元素的话,移除仅是将当前指向的元素设为null,并将head指向下一个位置。这样省事,但是会造成空间的浪费。

    public E pollLast() {
        int t = (tail - 1) & (elements.length - 1);
        E result = elements[t];
        if (result == null)
            return null;
        elements[t] = null;
        tail = t;
        return result;
    }


移除一个尾元素,更有意思,找到真正的元素设置为null,并将它作为下一个元素位置。

迭代器也提供了2个,分别从头至尾和从尾至头,呵呵。

高性能队列 Aeron Queue vs Chronicle Queue 在高性能、低延迟的消息传递领域,Aeron Queue和Chronicle Queue常被拿来对比。两者都具有出色的能力,但如何在它们之间做出选择可能并不容易。本篇博文将深入比较这两种消息传递解决方案,帮助您为下一项目做出明智的决定。 阅读详情

相关推荐

Hypermesh2021实战:塑料圆盘结构化网格划分全流程(附避坑指南)

本文详细介绍了使用Hypermesh2021进行塑料圆盘结构化网格划分的全流程操作,包括几何预处理、网格生成策略及质量验证。特别针对工程实践中常见的12个典型问题提供解决方案,帮助用户提升CAE仿真分析的精度和效率。

weixin_29294597的博客 318

【C++】queue和priority_queue

队列以及优先级队列

s_little_monster的博客 9615

斯坦福大学CS224d基础1:线性代数知识

本文为斯坦福CS229的内容,也是CS224d课程的背景数学知识。概括了在机器学习和深度学习中用到的大部分线性代数知识。为了便于大家查漏补缺,这里根据英文版本整理了一个中文版本。

龙心尘 2万+

python queue的用法_python各种queue总结

一、队列介绍定义:队列是一种特殊的线性表,是一种先进先出(FIFO)的数据结构。用途:用于线程之间或进程之间的数据共享。队列的五种基本操作:初始化队列入队出队判断队列是否为空判断队列是否为满python内置有四种队列:先进先出队列 Queue.Queue先进后出队列 Queue.LifoQueue优先级队列 Queue.ProorityQueue双端队列 collections.deque二、使用...

weixin_39721924的博客 2638

Cesium创建无人机视锥,同步视锥与鹰眼地图视角,实现视锥键盘控制。解决视锥初始化位置不准确问题等

本文描述了一个基于Cesium的3D视锥体可视化系统开发过程。系统实现了主视图与鹰眼视图的双屏联动,支持通过键盘控制视锥体的空间移动(WASD前后左右,Q/E旋转,C/Z升降),并实时同步更新两个视图。关键技术包括:1)基于主视图Scene创建Camera实现视锥体精确绘制;2)通过PerspectiveFrustum设置视锥参数;3)建立双视图的相机位置及视角同步机制。目前暂未实现视锥体far/near边界在鹰眼视图中的可视化,该系统可应用于无人机视角监控等三维场景交互需求。

coder_bin的博客 1590

【异常】Warp终端AI功能403封禁报错I‘m sorry, I couldn‘t complete that request.Request failed with error: ErrorSta

本文针对Warp终端出现的AI功能定向封禁报错,完整还原脱敏后的报错信息、深度解读报错本质,并提供分优先级的全流程可落地解决方案,可直接用于技术排查、内部知识库归档。

奶爸的编程之路,也就一周冷个三天 265

STL之queue

return a>b;

weixin_63201442的博客 2954

【技能】OpenClaw Skills学习及手搓一个极简skill

本文介绍了OpenClaw Skills的基础概念与使用方法。Skills是OpenClaw代理使用工具的核心载体,通过SKILL.md文件定义技能属性和执行方式。技能加载遵循"工作区>本地>内置>自定义目录"的优先级规则。用户可通过ClawHub一键安装现成技能,也可自定义开发技能:创建技能目录,编写包含YAML元数据和执行指令的SKILL.md文件,放置于工作区skills目录进行测试。文章还介绍了多代理场景下的技能共享、插件集成以及安全注意事项,包括沙箱使用和敏感

海兰 3976

queue和priority_queue及其函数

相信你可能有疑问,明明已经给了大堆和小堆优先级的规则设定可以进行替换,为何还要自己写优先级的设定呢?答案是当我们自定义类型且有多个参数在这类型中时,原先给的规则将不再适用就如我们设定一个包含两个参数的自定义类型,一个表示年龄,一个表示编号,此时原先的队列规则就不知道比较年龄来排序还是比较编号排序所以我们就需要自定义优先级的规则来给优先级队列进行排序优先级定义样例//定义一个自定义类型nodeint x, y;

2401_84360682的博客 1171

华为OD机考真题 新系统 - 小菊的寻宝之旅(Java/Py/C/C++/Js/Go)

华为OD机试真题 新系统【小菊的寻宝之旅】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【小菊的寻宝之旅】多语言题解。

qq_45776114的博客 618

ICML-2025《Learning from Sample Stability for Deep Clustering》

用于指导深度聚类模型的训练,从而提升模型对困难样本的学习能力,最终改善整体聚类性能。首先,利用K-means在原始样本(非增强)的表征上进行聚类,得到初始聚类分配。其目的是鼓励模型对同一稳定样本在连续epoch中产生相近的表征。输出差异大)会产生更大的损失值,从而引导模型优先优化这些困难样本。此损失借鉴了NT-Xent损失的思想,但将正样本对定义为。最后,通过对比学习优化聚类中心,将同一聚类在。为了获得更具代表性的聚类中心,论文提出。为了学习更鲁棒的表征,模型在在线网络。首先,论文定义了样本。

Christo的博客 829

queue

简要描述queue、deque、priority_queue的底层逻辑和相关函数

xiong2learning的博客 1889

2026最新华为OD机试新系统机考真题- 真题题库目录|全覆盖题库 + 逐点算法考点详解

2026年4月1日起,华为OD机试正式切换至新系统模式!采用力扣模式,无需自己写输入! 难度大幅度降低。正在备考华为OD机试的同学,优先刷新系统机试真题,可大幅提升通过率。 新系统考题考点与旧版一致,无需重新适应。本专栏所有算法题均配有详细思路解析,并提供C语言、JS、C++、Python、Go、Java多语言源码实现。订阅后私信即可开通专属OJ刷题权限,高效备考一次上岸!

算法大师! 2585

C++容器适配器stack、queue、priority_queue

C++容器适配器stack、queue、priority_queue

Xpccccc的博客 1221

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Queue.queue 退出与阻塞

Queue.queue 退出与阻塞 #-*-coding:utf-8-*- import threading import queue import time import random ''' 1.创建一个 Queue.Queue() 的实例,然后使用数据对它进行填充。 2.将经过填充数据的实例传递给线程类,后者是通过继承 threading.Thread 的方式创建的。 3.每次从队列中取出一个项目,并使用该线程中的数据和 run 方法以执行相应的工作。 4.在完成这项工作之后,使用 queue.

云中寻雾的博客 1506

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java Deque与Queue

java Deque与Queue 1、二者的关系 Deque继承Queue public interface Deque<E> extends Queue<E> 2、Queue接口 是集合框架Collection的子接口,是一种常见的数据结构,遵循先进先出的原则。基于链表来进行实现,的单向队列。LinkedList接口,实现了Queue,所以LinkedList,...

小十木的博客 4824

C++ queue 和priority_queue

优先级队列的适配会更复杂一些些。它的适配容器用的是vector。优先级队列就不是什么先进先出了,它虽然叫队列,但它不是真队列。其实它的底层是堆,可以在任意时刻插入数据,默认是大堆,当然也可以通过仿函数去调整。优先级队列有一个反人类的设计:传less仿函数,底层是大堆。传greater仿函数,底层是小堆。它的一些接口。

徐凤年llll的博客 1341

Python3中multiprocessing.Queue()和queue.Queue()的区别

from multiprocessing import Pool, Process, Queue from Queue import Queue Queue.Queue是进程内非阻塞队列,multiprocess.Queue是跨进程通信队列。 1.from queue import Queue 这个是普通的队列模式,类似于普通列表,先进先出模式,get方法会阻塞请求,直到有数据get出来为止 2....

Python美丽星球--微信(Felixzfb) 3929

【C++】stack和queue

世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你们有所帮助,同时也希望各位看官能对我的文章给与点评,希望我们能够携手共同促进进步,在编程的道路上越走越远!提示:以下是本篇文章正文内容,下面案例可供参考stack的文档介绍stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。

2301_79585944的博客 1217

multiprocessing.Queue()和queue.Queue()的区别

from multiprocessing import Pool, Process, Queue       # from Queue import Queuequeue.Queue是进程内非阻塞队列,multiprocess.Queue是跨进程通信队列。1.from queue import Queue 这个是普通的队列模式,类似于普通列表,先进先出模式,get方法会阻塞请求,直到有数据get出...

qq_32446743的博客 1万+

【C++】Queue与Priority Queue

STL库中Queue与Priority Queue 详解

weixin_61091020的博客 1万+

Java Queue类

Queue 队列简介Queue方法Queue子接口BlockingQueueDequeQueue实现类LinkedList 简介 Queue接口与List、Set同一级别,都是继承了Collection接口。 -------| Collection 单例集合的根接口。 ------------| List 如果是实现了List接口的集合类,具备的特点: 有序,可重复。 ------------| Set 如果是实现了Set接口的集合类,具备特点: 无序,不可重复。 ------------| Q

浅夏琉殇的博客 4731

Python: queue.Queue

Queue官方文档介绍网址: https://docs.python.org/2/library/queue.html 1. Queue       class Queue.Queue(maxsize=0):FIFO队列的构造函数(先进先出)。maxsize是一个整数,用于设置可放在队列中的项数上限。一旦达到此大小,插入将阻塞,直到使用队列项为止。如果maxsize小于或者等于0,则队列大小为...

qq_39930290的博客 5153

stack 和 queue

介绍了C++中的stack、queue、priority_queue等容器适配器及其底层实现。主要内容包括:1.stack的基本用法和实现,以及相关算法题(最小栈、栈序列匹配、逆波兰表达式);2.queue的基本用法和模拟实现;3.容器适配器概念及STL中stack/queue默认使用deque作为底层容器的原因;4.deque双端队列的原理和缺陷;5.priority_queue优先级队列的实现(基于堆)及其应用(如求第K大元素)。

原来是猿的成长足迹 1043

stack和queue

1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定 的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶被压入和弹出。3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下 操作:empty:判空操作back:获取尾部元素操作push_back。

hy____123的博客 1391

C++stack,queue,priority_queue以及deque的介绍和使用

C++stack,queue,priority_queue以及deque的介绍和使用,感兴趣的宝子们千万不要错过!!!

wer24_25的博客 1318
上一篇: Set
下一篇: 多线程简介
weeweee
博客等级 码龄16年 10粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值