1、优先队列的特点
队列 的特点是 先进先出, 入队列,将新元素置于队尾:
出队列,队头元素最先被移出:
优先队列不再遵循先入先出的原则,而是分为两种情况:
- 最大优先队列,无论入队顺序如何,都是当前最大的元素优先出队
- 最小优先队列,无论入队顺序如何,都是当前最小的元素优先出队
例:
有一个最大优先队列,其中的最大元素是8,那么虽然8并不是队头元素,
但出队时仍然让元素8首先出队
2、优先队列的实现
二叉堆的特性:
- 最大堆的堆顶是整个堆中的最大元素
- 最小堆的堆顶是整个堆中的最小元素
可以用最大堆来实现最大优先队列:
每一次 入队 操作就是堆的 插入 操作;
每一次 出队 操作就是删除堆顶节点
入队操作 步骤如下:
- 插入新节点5
- 新节点5“上浮”到合适位置
出队操作 步骤如下: - 让原堆顶节点10出队
- 把最后一个节点1替换到堆顶位置
- 节点1“下沉”,节点9成为新堆顶
二叉堆节点“上浮”和“下沉”的时间复杂度都是 O(logn)
所以优先队列入队和出队的时间复杂度也是 O(logn)
3、优先队列的代码实现
采用数组来存储二叉堆的元素,当元素数量超过数组长度时,需要进行扩容来扩大数组长度
import java.util.Arrays;
//构建队列
public class TreeNode4 {
private int[] array;
private int size;
public TreeNode4(){
//队列初始长度为32
array = new int[32];
}
/**
* “入队”操作
* @param key 入队元素
*/
public void enQueue(int