【数据结构与算法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)
代码过于简单,就不加注释了。