队列(Queue)数据结构详解(java描述)
队列是一种先进先出(FIFO, First In First Out)的线性数据结构。元素的插入(入队)在队尾进行,元素的删除(出队)在队首进行。
·
目录
-
-
4.1 数组实现(顺序队列)
-
4.2 链表实现(链式队列)
-
1. 队列的定义
队列是一种先进先出(FIFO, First In First Out)的线性数据结构。元素的插入(入队)在队尾进行,元素的删除(出队)在队首进行。

2. 队列的特点
-
操作受限:只能在一端插入(rear),另一端删除(front)
-
动态集合:元素数量可动态变化
-
FIFO 原则:最早入队的元素最先被处理
3. 队列的基本操作
| 操作 | 描述 | 时间复杂度 |
|---|---|---|
enqueue() |
向队尾添加元素 | O(1) |
dequeue() |
移除队首元素 | O(1) |
peek() |
查看队首元素(不删除) | O(1) |
isEmpty() |
检查队列是否为空 | O(1) |
isFull() |
检查队列是否已满(仅限固定大小队列) | O(1) |
4. 队列的实现方式
4.1 数组实现(顺序队列)(java)
public class ArrayQueue {
private int maxSize;
private int front; // 指向队首前一个位置
private int rear; // 指向队尾元素
private int[] arr;
// 初始化队列
public ArrayQueue(int size) {
maxSize = size;
arr = new int[maxSize];
front = -1;
rear = -1;
}
// 入队操作
public void enqueue(int value) {
if (isFull()) {
System.out.println("队列已满");
return;
}
if (isEmpty()) front = 0;
arr[++rear] = value;
}
// 出队操作
public int dequeue() {
if (isEmpty()) throw new RuntimeException("队列空");
int value = arr[front++];
if (front > rear) { // 队列已空时重置指针
front = -1;
rear = -1;
}
return value;
}
// 判断队列是否为空
public boolean isEmpty() {
return front == -1 && rear == -1;
}
// 判断队列是否已满
public boolean isFull() {
return rear == maxSize - 1;
}
}
4.2 链表实现(链式队列)
class Node {
int data;
Node next;
Node(int data) {
this.data = data;
this.next = null;
}
}
public class LinkedQueue {
private Node front;
private Node rear;
// 入队
public void enqueue(int value) {
Node newNode = new Node(value);
if (rear == null) {
front = rear = newNode;
} else {
rear.next = newNode;
rear = newNode;
}
}
// 出队
public int dequeue() {
if (isEmpty()) throw new RuntimeException("队列空");
int value = front.data;
front = front.next;
if (front == null) rear = null;
return value;
}
}
5. 循环队列
解决数组实现的"假溢出"问题,通过取模运算实现空间复用。
class CircularQueue {
private int[] data;
private int front;
private int rear;
private int size;
public CircularQueue(int k) {
data = new int[k];
front = -1;
rear = -1;
size = k;
}
public boolean enQueue(int value) {
if (isFull()) return false;
if (isEmpty()) front = 0;
rear = (rear + 1) % size;
data[rear] = value;
return true;
}
public boolean deQueue() {
if (isEmpty()) return false;
if (front == rear) {
front = -1;
rear = -1;
} else {
front = (front + 1) % size;
}
return true;
}
}
6. 双端队列(Deque)
允许两端进行插入和删除操作的高级队列。
| 操作 | 描述 |
|---|---|
addFirst() |
在队首插入元素 |
addLast() |
在队尾插入元素 |
removeFirst() |
删除并返回队首元素 |
removeLast() |
删除并返回队尾元素 |
7. 优先队列(Priority Queue)
元素带有优先级的队列,总是取出优先级最高的元素。通常使用堆(Heap)实现。
PriorityQueue<Integer> pq = new PriorityQueue<>(); pq.add(3); // 插入元素 pq.poll(); // 取出最小元素
8. 队列的应用场景
-
CPU 任务调度
-
打印机作业队列
-
广度优先搜索(BFS)
-
消息队列系统(如 RabbitMQ)
-
实时系统事件处理
-
呼叫中心电话排队
9. 复杂度分析
| 实现方式 | 入队 | 出队 | 查找 | 空间 |
|---|---|---|---|---|
| 数组队列 | O(1) | O(1) | O(n) | O(n) |
| 链表队列 | O(1) | O(1) | O(n) | O(n) |
| 循环队列 | O(1) | O(1) | O(n) | O(n) |
| 优先队列(堆) | O(log n) | O(log n) | O(n) | O(n) |
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)