欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

(数据结构):优先级队列(Priority Queue)

程序员文章站 2022-12-12 15:48:08
目录优先级队列(Priority Queue)优先级队列应用场景优先队列的底层实现(附代码)优先级队列(Priority Queue)接口:public interface Queue {int size();// 元素的数量boolean isEmpty();// 是否为空void enQueue(E element);// 入队E deQueue();// 出队E front();// 获取队列的头元素void cle...

目录

优先级队列(Priority Queue)

优先级队列应用场景

优先队列的底层实现(附代码)

优先级队列(Priority Queue)

(数据结构):优先级队列(Priority Queue)

  • 接口:
public interface Queue<E> {
	int size();	// 元素的数量
	boolean isEmpty();	// 是否为空
	void enQueue(E element);	// 入队
	E deQueue();	// 出队
	E front();	// 获取队列的头元素
	void clear();	// 清空
}

优先级队列应用场景

  • 医院的夜间门诊
    • 队列元素是病人
    • 优先级是病情的严重情况、挂号时间
  • 操作系统的多任务调度
    • 队列元素是任务
    • 优先级是任务类型

优先队列的底层实现(附代码)

  • 利用二叉堆作为优先队列的底层实现。
  • 利用 Comparator 或 Comparable 去自定义优先级高低。
/**
 * 二叉堆实现优先级队列
 * @author yusael
 */
public class PriorityQueue<E> {
	private BinaryHeap<E> heap;
	
	// 通过 comparator 自定义优先级高低
	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.java:
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 + "]";
	}
}
  • Main.java
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());
		}
	}
}
  • 输出
Person [name=James, boneBreak=15]
Person [name=Rose, boneBreak=10]
Person [name=Jake, boneBreak=5]
Person [name=Jack, boneBreak=2]

 

本文地址:https://blog.csdn.net/baidu_41388533/article/details/110501958