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