优先级队列的实现

优先级队列(Priority Queue)

优先级队列本身也是一个队列,只不过常规的队列是先进先出,而优先级队列可以插队,即让队列中优先级最高的元素先出队。在Java中,普通队列是由双向链表来实现的,如果优先级队列也使用双向链表,那么通过遍历找优先级最高的节点需要O(n)的时间复杂度,但如果使用二叉堆,那么入队和出队的时间复杂度都可以降到O(logn)。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

接口

方法功能
int size()获取队列大小
void isEmpty()是否为空
void clear()清空队列
void offer()进队
E poll()出队
E peek()获取队顶元素

具体实现

我们可以通过一个二叉堆来实现优先级队列(有关堆见:堆的概念与二叉堆的实现详细图解)。

在这里插入图片描述
代码:

public class PriorityQueue<E> {
    private BinaryHeap<E> heap;

    public PriorityQueue(){
        this(null);
    }

    //允许传入优先级比较方法
    public PriorityQueue(Comparator<E> comparator){
        heap=new BinaryHeap<>(comparator);
    }

    public int size(){
        return heap.size();
    }

    public boolean isEmpty(){
        return heap.isEmpty();
    }

    public void clear(){
        heap.clear();
    }

    /**
     * 入队
     */
    public void offer(E element) {
        heap.add(element);
    }

    public E poll() {
        return heap.remove();
    }

    public E peek() {
        return heap.get();
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值