數(shù)據(jù)結(jié)構(gòu)-優(yōu)先級隊列(Priority Queue)

? 優(yōu)先級隊列也是個隊列,因此也是提供以下接口
? int size(); // 元素的數(shù)量
?boolean isEmpty();//是否為空
?void clear();// 清空
?void enQueue(E element);//入隊
?E deQueue();// 出隊
?E front();// 獲取隊列的頭元素

? 優(yōu)先級隊列則是按照優(yōu)先級高低進行出隊,比如將優(yōu)先級最高的元素作為隊頭優(yōu)先出隊

優(yōu)先級隊列的應用場景舉例
? 醫(yī)院的夜間門診
p隊列元素是病人
p優(yōu)先級是病情的嚴重情況、掛號時間

? 操作系統(tǒng)的多任務(wù)調(diào)度
隊列元素是任務(wù)
優(yōu)先級是任務(wù)類型

優(yōu)先隊列的底層實現(xiàn)

? 根據(jù)優(yōu)先隊列的特點,很容易想到:可以直接利用二叉堆作為優(yōu)先隊列的底層實現(xiàn)

package com.njf;

import java.util.Comparator;

public class PriorityQueue<E> {
    
    private BinaryHeap<E> heap;
    
    public PriorityQueue(Comparator<E> comparator) {
        heap = new BinaryHeap<>(comparator);
    }
    
    public PriorityQueue() {
        this(null);
    }
    
    public int size() {
        return heap.size();
    }

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

    public void enQueue(E element) {
        heap.add(element);
    }

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

    public E front() {
        return heap.get();
    }
}

Person類

package com.njf;

public class Person implements Comparable<Person>{
    private String name;
    private int boneBreak;
    public Person(String name, int boneBreak) {
        this.name = name;
        this.boneBreak = boneBreak;
    }
    
    @Override
    public int compareTo(Person person) {
        return this.boneBreak - person.boneBreak;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", boneBreak=" + boneBreak + "]";
    }
}

驗證

package com.njf;

public class Main {
    public static void main(String[] args) {
        PriorityQueue<Person> queue = new PriorityQueue<>();
        queue.enQueue(new Person("Jack", 2));
        queue.enQueue(new Person("Rose", 10));
        queue.enQueue(new Person("Jake", 5));
        queue.enQueue(new Person("James", 15));
        
        while (!queue.isEmpty()) {
            System.out.println(queue.deQueue());
        }
    }
}

打印結(jié)果:

Person [name=James, boneBreak=15]
Person [name=Rose, boneBreak=10]
Person [name=Jake, boneBreak=5]
Person [name=Jack, boneBreak=2]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容