队列(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)