Java 优先队列PriorityQueue的最基础使用
本博客记录一下Java中自带的优先队列类——PriorityQueue及其主要用法
树、堆和优先队列
首先介绍一下什么是优先队列,这就需要先从二叉树讲起。二叉树的概念大家肯定都知道了,不再赘述。由二叉树,可以引申到最小树(最大树),其定义为:
在一棵二叉树中,如果每个结点的值,都小于(大于)或等于其子节点(如果有的话)的值,那么这棵二叉树就是最小树(最大树)。
这个定义应该也还蛮好理解的。
下面再来看最小堆(最大堆)的定义:
最小堆(最大堆)就是最小(最大)的完全二叉树。
关于堆,就有很多相关算法,比如在堆中添加一个元素,删除一个元素,还有堆排序……今天我们不讲这些,只讲优先队列。优先队列的具体定义是:
优先队列是一种特殊的数据结构,其中能被访问和删除的是具有最高优先级的元素。
仔细想想,其实堆就是一种优先队列——比如一个最小堆,如果定义最高优先级的元素为堆中最小的元素,那么每次的访问、删除操作都只能发生在堆顶。当然优先队列中可以存储不同的数据类型,也要定义独特的优先级比较方法。
Java中使用PriorityQueue实现优先队列
因为PriorityQueue是Java自带的类,因此只要写出来就行,后面跟一个<>表示优先队列中存放什么类型的数据。
如:
import java.util.PriorityQueue;
PriorityQueue<Integer> pq = new PriorityQueue<>();
此时创建的是一个最小堆(这里为了方便,混淆一下堆和优先队列的说法)。举个例子:
import java.util.PriorityQueue;
public class Try {
public static void main(String[] args) {
minHeap();
}
public static void minHeap() {
PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.offer(1);
pq.offer(8);
pq.offer(5);
while (!pq.isEmpty()) {
System.out.println(pq.poll());
}
}
}
代码里的offer()方法、isEmpty()方法、poll()方法都是老熟人了,用过Deque、Stack等Java自带的类的同学肯定不陌生,这里不介绍了。上述代码输出的结果是:
1
5
8
将整型换成其他数据类型也可以,比如char型:
import java.util.PriorityQueue