本文档详细介绍了 The Algorithms Java 仓库中的队列数据结构实现。队列是遵循先进先出(FIFO)原则的基础数据结构,其中元素从队尾添加,从队头移除。该仓库提供了多种队列实现,它们具有不同的底层机制和性能特征。
该仓库提供了两种主要的队列实现
这些实现展示了队列抽象数据类型的不同方法,每种方法都有其自身的优点和权衡。
来源:src/main/java/com/thealgorithms/datastructures/queues/CircularQueue.java src/main/java/com/thealgorithms/datastructures/queues/LinkedQueue.java
两种队列实现都支持具有相似语义的标准队列操作
| 操作 | 描述 | CircularQueue | LinkedQueue |
|---|---|---|---|
| 入队(Enqueue) | 向队尾添加元素 | enQueue(T value) | enqueue(T data) |
| 出队(Dequeue) | 从队头移除元素 | deQueue() | dequeue() |
| 查看 | 查看队头元素 | peek() | peekFront() |
| 大小 | 获取元素数量 | size() | size() |
| 是否为空 | 检查队列是否为空 | isEmpty() | isEmpty() |
| 清空 | 移除所有元素 | deleteQueue() | clear() |
来源:src/main/java/com/thealgorithms/datastructures/queues/CircularQueue.java55-137 src/main/java/com/thealgorithms/datastructures/queues/LinkedQueue.java39-175
循环队列(CircularQueue)使用固定大小的数组实现队列,具有循环环绕行为。这种方法通过在元素出队后重用数组中的位置来高效利用空间。
循环队列(CircularQueue)使用两个指针来跟踪队列的头部和尾部
beginningOfQueue - 指向队头元素(元素出队的位置)topOfQueue - 指向队尾元素(元素入队的位置)当元素添加或移除时,这些指针在到达数组末尾时会“循环环绕”,从而产生循环行为。
入队操作:
topOfQueue(如有必要则循环)出队操作:
beginningOfQueue 位置的元素beginningOfQueue(如有必要则循环)循环行为:环绕通过模运算实现:(index + 1) % size。
来源:src/main/java/com/thealgorithms/datastructures/queues/CircularQueue.java25-48 src/main/java/com/thealgorithms/datastructures/queues/CircularQueue.java74-105
链式队列(LinkedQueue)使用链表结构实现队列,其中每个元素引用队列中的下一个元素。这种方法允许在添加和移除元素时动态调整大小。
链式队列(LinkedQueue)维护着链表的头部和尾部节点的引用
front - 指向第一个节点(元素出队的位置)rear - 指向最后一个节点(元素入队的位置)入队操作:
front 和 rear 都设置为新节点rear 链接到新节点并更新 rear出队操作:
front 节点检索数据front 更新为下一个节点rear 设置为 null附加功能:
Iterator 接口支持队列元素的迭代peekRear() 方法以查看最后一个元素peek(int pos) 提供位置访问来源:src/main/java/com/thealgorithms/datastructures/queues/LinkedQueue.java6-22 src/main/java/com/thealgorithms/datastructures/queues/LinkedQueue.java49-85
| 操作 | CircularQueue | LinkedQueue |
|---|---|---|
| 入队(Enqueue) | O(1) | O(1) |
| 出队(Dequeue) | O(1) | O(1) |
| 查看 | O(1) | O(1) |
| 位置访问 | O(1) | O(n) |
| 功能 | CircularQueue | LinkedQueue |
|---|---|---|
| 内存分配 | 静态(创建时固定) | 动态(按需增长) |
| 空间效率 | 可能在未充分利用的数组中浪费空间 | 仅使用实际元素所需的空间 |
| 容量限制 | 固定最大容量 | 无限制(受可用内存限制) |
| 迭代支持 | 没有内置迭代器 | 实现 Iterable 接口 |
| 额外操作 | 仅支持基本队列操作 | 支持查看队尾和特定位置的元素 |
来源:src/main/java/com/thealgorithms/datastructures/queues/CircularQueue.java src/main/java/com/thealgorithms/datastructures/queues/LinkedQueue.java
来源:src/test/java/com/thealgorithms/datastructures/queues/CircularQueueTest.java12-32 src/test/java/com/thealgorithms/datastructures/queues/CircularQueueTest.java107-121
来源:src/test/java/com/thealgorithms/datastructures/queues/LinkedQueueTest.java36-54 src/test/java/com/thealgorithms/datastructures/queues/LinkedQueueTest.java72-91 src/test/java/com/thealgorithms/datastructures/queues/LinkedQueueTest.java126-137
队列是许多算法和系统中使用的基本数据结构
来源:src/main/java/com/thealgorithms/datastructures/trees/PrintTopViewofTree.java62-64
两种队列实现都妥善处理了边缘情况
这些细节可以在验证两种实现正确性的大量测试用例中找到。
来源:src/test/java/com/thealgorithms/datastructures/queues/CircularQueueTest.java79-87 src/test/java/com/thealgorithms/datastructures/queues/LinkedQueueTest.java57-69