Queue 与 Deque
学习队列、双端队列、PriorityQueue、ArrayDeque
Queue 与 Deque
队列(Queue)和双端队列(Deque)是重要的数据结构。
学完本章你将: 掌握队列接口、PriorityQueue、ArrayDeque。
Queue 基础
java
Queue<String> queue = new LinkedList<>();
// 添加
queue.offer("A"); // 推荐(失败返回 false)
queue.add("B"); // 失败抛异常
// 取出并移除
String head = queue.poll(); // 推荐(空返回 null)
String head2 = queue.remove(); // 空抛异常
// 查看不移除
String peek = queue.peek(); // 空返回 null
String elem = queue.element(); // 空抛异常
PriorityQueue —— 优先队列
java
// 默认最小堆
Queue<Integer> pq = new PriorityQueue<>();
pq.offer(5);
pq.offer(1);
pq.offer(3);
System.out.println(pq.poll()); // 1(最小先出)
System.out.println(pq.poll()); // 3
// 自定义比较器(最大堆)
Queue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);
maxHeap.offer(5);
maxHeap.offer(1);
System.out.println(maxHeap.poll()); // 5(最大先出)
// 实战:TopK
int[] nums = {3, 1, 4, 1, 5, 9, 2};
Queue<Integer> topK = new PriorityQueue<>();
for (int n : nums) {
topK.offer(n);
if (topK.size() > 3) topK.poll(); // 保留最大的 3 个
}
System.out.println(topK); // [4, 5, 9]
Deque —— 双端队列
java
// ArrayDeque 比 LinkedList 更高效
Deque<String> deque = new ArrayDeque<>();
// 两端操作
deque.addFirst("A"); // [A]
deque.addLast("B"); // [A, B]
deque.offerFirst("C"); // [C, A, B]
deque.offerLast("D"); // [C, A, B, D]
System.out.println(deque.pollFirst()); // "C"
System.out.println(deque.pollLast()); // "D"
// 作为栈使用(推荐替代 Stack)
Deque<String> stack = new ArrayDeque<>();
stack.push("A");
stack.push("B");
System.out.println(stack.pop()); // "B"