什么是队列
队列是数据结构中比较重要的一种类型,它支持 FIFO,尾部添加、头部删除(先进队列的元素先出队列),跟我们生活中的排队类似。
队列有两种:
- 单队列
- 循环队列
单队列就是常见的队列, 每次添加元素时,都是添加到队尾:
以数组实现的队列为例,初始时队列长度固定为 4,font 和 rear 均为 0:
每添加一个元素,rear 后移一位。当添加四个元素后, rear 到了索引为 4 的位置:
这时 a1,a2 出队,front 后移动到 2:
这时想要再添加两个元素,但 rear 后移两位后就会越界:
明明有三个空位,却只能再放入一个!这就是单队列的“假溢出”情况。
(上述参考借鉴自 http://www.nowamagic.net/librarys/veda/detail/2350)
针对这种情况,解决办法就是后面满了,就再从头开始,也就是头尾相接的循环。这就是 “循环队列” 的概念。
循环队列:
循环队列中,
rear = (rear - size) % size
接着上面的例子,当 rear 大于 队列长度时,rear = ( 5 - 5) % 5 = 0 :
这样继续添加时,还可以添加几个元素:
那如何判断队列是否装满元素了呢,单使用 front == rear 无法判断究竟是空的还是满了。
两种方法:
- 加个标志 flag ,初始为 false,添加满了置为 true;
- 不以 front = rear 为放满标志,改为 (rear - front) % size = 1。
法 2 的公式放满元素时空余了一个位置,这个公式是什么意思呢?
接着上面的情况,当 rear 从后面添加元素跑到前面 0 时,再添加一个元素 a6,rear 后移一位到 1,这时 front = 2, (1 - 2) % 5 = 1, 满足放满条件。
因此,当 rear > font 时,队列中元素个数 = rear - font;
当 rear < font 时,队列中元素分为两部分: size - font 和 rear ,也就是 rear + size - font。以上述图片为例,队列中元素个数 = 1 + 5 - 2 = 4.
接着我们介绍 Java 集合框架中的队列 Queue
Java 集合中的 Queue 继承自 Collection 接口 ,Deque, LinkedList, PriorityQueue, BlockingQueue 等类都实现了它。
Queue 用来存放 等待处理元素 的集合,这种场景一般用于缓冲、并发访问。
除了继承 Collection 接口的一些方法,Queue 还添加了额外的 添加、删除、查询操作。
添加、删除、查询这些个操作都提供了两种形式,其中一种在操作失败时直接抛出异常,而另一种则返回一个特殊的值:
Queue 方法介绍:
1.add(E), offer(E) 在尾部添加:
boolean add(E e);
boolean offer(E e);
他们的共同之处是建议实现类禁止添加 null 元素,否则会报空指针 NullPointerException;
不同之处在于 add() 方法在添加失败(比如队列已满)时会报 一些运行时错误 错;而 offer() 方法即使在添加失败时也不会奔溃,只会返回 false。
2016.11.21 添加
注意
Queue 是个接口,它提供的 add, offer 方法初衷是希望子类能够禁止添加元素为 null,这样可以避免在查询时返回 null 究竟是正确还是错误。
事实上大多数 Queue 的实现类的确响应了 Queue 接口的规定,比如 ArrayBlockingQueue,PriorityBlockingQueue 等等。
但还是有一些实现类没有这样要求,比如 LinkedList。
感谢 sumsear 指出。
2.remove(), poll() 删除并返回头部:
E remove();
E poll();
当队列为空时 remove() 方法会报 NoSuchElementException 错; 而 poll() 不会奔溃,只会返回 null。
3.element(), peek() 获取但不删除:
E element();
E peek();
相关推荐
自定义Queue队列意味着我们需要创建一个类来实现Queue接口,以满足特定的需求或性能优化。 首先,让我们了解一下`java.util.Queue`接口提供的主要方法: 1. `void add(E e)`: 向队列尾部添加元素,如果队列已满,...
《ThinkPHP5.0.24与Queue队列技术详解》 在PHP开发领域,ThinkPHP框架因其简洁高效的特性而广受欢迎,特别是在企业级应用中,其提供的队列功能能够帮助开发者实现异步任务处理,提高系统性能。本文将详细探讨在...
在.NET框架中,`ConcurrentQueue<T>`是一个线程安全的队列数据结构,它被设计用于多线程环境下的高效并发操作。这个类是System.Collections.Concurrent命名空间的一部分,提供了在多个线程读写数据时的安全性和性能...
"Queue队列.rar"这个文件很可能包含了关于易语言(EasyLanguage)编程中队列数据结构的源代码示例。易语言是一款面向普通用户的、以中文编程为特色的编程软件,它的语法简洁明了,使得初学者也能快速上手。 队列是...
通过学习和分析这个"易语言Queue队列源码",开发者可以深入理解易语言的内存管理、数据结构实现以及基本操作的细节。这对于提升编程技能,特别是理解底层数据结构和算法的工作原理非常有帮助。同时,这也为自定义...
通过 queue 队列,我们可以将更新 GUI 的任务安全地传递给主线程,从而避免因为直接在子线程中更新 GUI 而导致的错误。 系统要求: Python 3.x tkinter 库(通常与 Python 标准库一起安装) queue 模块(Python ...
易语言Queue队列源码通常包含以下几个核心部分: 1. **队列结构定义**:在易语言中,队列的实现可能基于数组或链表。队列的结构体应包括队头和队尾的索引或指针,以及存储元素的容器。例如,如果使用数组,可以定义...
在这个“activemq的queue队列模式的maven,spring的demo”中,我们将深入探讨如何使用Maven构建工具、Spring框架以及ActiveMQ来创建一个基于队列模式的消息传递系统。 首先,让我们了解队列模式的基本概念。在消息...
C++写的Queue队列
Python3的`queue`模块是线程安全的数据结构,它实现了多线程环境下的队列操作,主要用于在并发环境中管理任务和数据交换。队列在计算机科学中是一种基础数据结构,遵循特定的出队和入队规则,如先进先出(FIFO)、...
易语言Queue队列源码,Queue队列,Test,Init,Count,IsEmpty,Clear,PopBin,PopBool,PopInt,PopStr,PushBin,PushBool,PushInt,PushStr,CoInitialize,CoUninitialize
在FreeSWITCH中,`queue`队列是用于处理呼叫分配的重要组件,它允许系统根据预定义的策略将呼叫分发给坐席或代理。动态获取`queue`队列涉及实时从数据库中读取队列配置,而不是静态地在配置文件中定义。以下是关于这...
C++作为一种强大的编程语言,提供了多种方式来实现队列,包括标准模板库(STL)中的`queue`容器以及自定义的数据结构。本篇文章将深入探讨C++中队列的实现及其应用。 首先,我们要了解C++标准库中的`<queue>`头文件...
5. **性能优化**:根据需求,你可能要考虑队列的大小限制,避免内存过度消耗,或者使用`ConcurrentQueue`等线程安全的集合,以提高并发性能。 在“WindowsApplication3”项目中,这个示例可能包含了一个简单的UI,...
本 Demo 演示了如何使用 Python 的标准库 queue 和 tkinter 来创建一个简单的图形用户界面(GUI)。此 Demo 的目的是展示如何通过队列实现 GUI 的即时刷新,尤其是在进行耗时操作时保持界面的响应性。 系统要求: ...
与普通队列不同,循环队列在空间上形成一个环形结构,当队尾达到数组边界时,可以重新回到数组的起始位置,从而避免了满队列时需要创建新队列的问题。这提高了空间利用率并简化了管理过程。 在Java或Android环境中...
// // //C#中队列Queue与线程的应用 // // static void Main(string[] args) { DocumentManager mg = new DocumentManager(); ProcessDocuments prcess = new ProcessDocuments(mg);
主要介绍了python进程间通信 mulitiProcessing Queue队列实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
在 Laravel 框架中,Queue 队列是一种强大的工具,用于处理耗时较长或需要异步执行的任务,从而提高应用程序的响应速度和用户体验。本文将详细介绍 Laravel Queue 队列的使用技巧和配置。 首先,Laravel 提供了多种...