PriorityQueue优先队列
PriorityQueue
是 Java 中的一个基于优先级的队列,它可以实现最小堆或最大堆的功能。在 PriorityQueue
中,每个元素都有一个优先级,根据优先级可以决定出队顺序。
PriorityQueue
的实现基于堆,堆是一种完全二叉树,可以用数组来表示。对于最小堆,堆中每个节点的值都不大于其子节点的值;对于最大堆,堆中每个节点的值都不小于其子节点的值。
以下是 PriorityQueue
的主要方法:
add(E e)
:向队列中添加元素e
。offer(E e)
:向队列中添加元素e
,与add
方法相同。remove()
:从队列中删除并返回头部元素,若队列为空则抛出异常。poll()
:从队列中删除并返回头部元素,若队列为空则返回null
。element()
:获取但不删除头部元素,若队列为空则抛出异常。peek()
:获取但不删除头部元素,若队列为空则返回null
。size()
:获取队列中元素数量。isEmpty()
:判断队列是否为空。
除此之外,PriorityQueue
还可以使用比较器来自定义元素间的优先级关系,例如:
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>((a, b) -> a - b);
以上代码表示创建一个最小堆,其元素的优先级按照数值大小排序。
在实际应用中,PriorityQueue
常用于实现一些贪心算法、Dijkstra 算法等需要维护当前状态下最优解的场景。
代码示例:
import java.util.PriorityQueue;public class Main {public static void main(String[] args) {// 创建一个最小堆 PriorityQueuePriorityQueue<Integer> minHeap = new PriorityQueue<>();// 向队列中添加元素minHeap.add(3);minHeap.offer(1);minHeap.add(4);minHeap.offer(2);// 从队列中删除并返回头部元素int head1 = minHeap.remove();System.out.println("Removed element: " + head1);// 从队列中删除并返回头部元素int head2 = minHeap.poll();System.out.println("Polled element: " + head2);// 获取但不删除头部元素int head3 = minHeap.element();System.out.println("Element at head: " + head3);// 获取但不删除头部元素int head4 = minHeap.peek();System.out.println("Peeked element: " + head4);// 获取队列中元素数量int size = minHeap.size();System.out.println("Size of the queue: " + size);// 判断队列是否为空boolean isEmpty = minHeap.isEmpty();System.out.println("Is the queue empty? " + isEmpty);}
}