【数据结构与算法05】优先级队列

定义:其实就是有序队列。

运算限制:自动排序。既然是自动排序那就不需要考虑先进先出的问题了,排序之后就乱了,所以只需要定义排序方式(取最大还是取最小),这里为了简化逻辑,避免再出现队列需要考虑循环使用存储空间的问题,我们把最大值永远放在下标0的位置,出队列时取最小值。当然你也可以反过来。

基本运算:

1,添加。

2:移除。

3:取最小值。

public class PriorityQueue {
	
	private Long[] queArray;
	
	private int maxSize ;//数组初始化长度
	
	private int nItems ;//数组实际应用长度
	
	public PriorityQueue(int size){
		maxSize = size ;
		queArray = new Long[maxSize];
		nItems = 0 ;
	}

	//插入,大到小排序
	public void insert(long item){
		if(isFull()) throw new ArrayIndexOutOfBoundsException(maxSize);
		int j = 0 ;
		if(nItems==0){
			queArray[nItems++] = item ;
		}else{
			for(j=nItems-1 ;j>=0;j--){
				if(item>queArray[j]){
					queArray[j+1] = queArray[j];
				}else{
					break;
				}
			}
			queArray[j+1] = item;
			nItems++;
		}
	}
	public long remove(){
		if(isEmpty()) throw new NullPointerException();
		return queArray[--nItems];
	}
	
	public long min(){
		if(isEmpty()) throw new NullPointerException();
		return queArray[nItems-1];
	}
	
	public boolean isEmpty(){
		return (nItems==0);
	}
	public boolean isFull(){
		return (nItems==maxSize);
	}
	
	public static void main(String[] args) {
		PriorityQueue priorityQueue = new PriorityQueue(10);
		priorityQueue.insert(10);
		priorityQueue.insert(13);
		priorityQueue.insert(15);
		priorityQueue.insert(8);
		synchronized (System.out) {
			for(int i =0;i<10;i++){
				System.out.print(priorityQueue.queArray[i]+",");
			}
			System.out.println();
			System.out.println("min"+priorityQueue.min());
			System.out.println("remove"+priorityQueue.remove());
			System.out.println("remove"+priorityQueue.remove());
			System.out.println("remove"+priorityQueue.remove());
			System.out.println("remove"+priorityQueue.remove());
			//System.out.println("min"+priorityQueue.min());
			System.out.println("remove"+priorityQueue.remove());
		}
	}
}

运行结果:

15,13,10,8,null,null,null,null,null,null,
min8
remove8
remove10
remove13
remove15
Exception in thread "main" java.lang.NullPointerException
	at data.queue.PriorityQueue.remove(PriorityQueue.java:47)
	at data.queue.PriorityQueue.main(PriorityQueue.java:80)

代码过于简单,就不加注释了。

这是用数组实现的优先级队列,其实还有多种实现方式,后面会介绍借助树的思想实现的优先级队列,其实它有另一个名字——堆。

经验分享 程序员 微信小程序 职场和发展