? 優(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]