优先级队列
- 优先级结点类
- 优先级队列接口
- 优先级队列具体实现
- 测试
优先级结点类
package com.lovely.queue;public class PriorityNode {/*** @author echo lovely* 2020年6月7日下午8:52:08* 优先级结点类*/public Object data; // 结点数据域public int priority; // 结点的优先级public PriorityNode next;public PriorityNode(Object x, int priority) {this.data = x;this.priority = priority;}}
优先级队列接口
package com.lovely.queue;public interface IPriorityQueue {public void clear(); public boolean isEmpty(); public int length(); public Object peek(); // 返回队首元素 public void offer(Object x, int priority) throws Exception; // x按优先级插入队列,队尾入队public Object poll(); // 返回队首元素,并删除 队首出队public void display(); // 输出队列中所有数据元素}
优先级队列具体实现
package com.lovely.queue;public class PriorityQueue implements IPriorityQueue {/*** @author echo lovely* 2020年6月7日下午8:54:53* * 来由:* 有些排队等待问题,仅按照先来先服务原则,不能解决需求,还需将任务的重要程度作为排队的依据* * 例如操作系统中的进程调度管理,每个进程都有一个优先级值表示进程的紧急调度* 优先级高的进程先执行,同级进程按照先进先出原则排队等待* 则操作系统,需要使用优先级队列来管理和调度进程。* * 对于此demo * 入队结点有优先级!* 优先数越小,优先级别越大*/private PriorityNode front; // 队列首结点private PriorityNode rear; // 队列尾结点@Overridepublic void clear() {front = rear = null;}@Overridepublic boolean isEmpty() {return front == null;}@Overridepublic int length() {PriorityNode p = front;int length = 0;while(p != null) {p = p.next;length ++;}return length;}@Overridepublic Object peek() {if (isEmpty()) return null;return front.data;}@Overridepublic void offer(Object x, int priority) throws Exception {PriorityNode node = new PriorityNode(x, priority);if (!isEmpty()) {PriorityNode p = front;PriorityNode q = front;while (p != null && p.priority <= node.priority) { // 按优先级寻找元素所在位置q = p;p = p.next;}if (p == null) { // 队尾rear.next = node;rear = node;} else if (p == front) { // 队首node.next = front;front = node;} else { // 队中q.next = node;node.next = p;}} else { // 队列为空front = rear = node;}}@Overridepublic Object poll() {if (front == null)return null;// 首结点PriorityNode p = front;front = front.next;if (p == rear) rear = null;return p.data;}@Overridepublic void display() {if (!isEmpty()) {for (PriorityNode p = front; p != null; p = p.next) {System.out.print("数据 " + p.data + " 优先级 " + p.priority + "\n");}System.out.println();} else {System.out.println("此队列为空。");}}}
测试
package com.lovely.queue;public class TestPriorityQueue {public static void main(String[] args) {// 优先级队列testPriorityQueue pq = new PriorityQueue();try {// 优先级数越小 优先入队pq.offer(1, 0);pq.offer("hello", 0);pq.offer(2, 9);pq.offer(3, 3);pq.offer(9, 1);} catch (Exception e) {e.printStackTrace();}pq.display();System.out.println("队首 " + pq.peek());System.out.println("出队 " + pq.poll());pq.display();}}
so…
数据 1 优先级 0
数据 hello 优先级 0
数据 9 优先级 1
数据 3 优先级 3
数据 2 优先级 9队首 1
出队 1
数据 hello 优先级 0
数据 9 优先级 1
数据 3 优先级 3
数据 2 优先级 9