优先队列上文介绍了一种方法,另一种方法就是在insert()方法中添加代码,将所有较大的元素向右边一定一格以使数组保持有序(和插入排序一样)。这样,最大的元素总会在数组的一边,优先队列的删除最大元素操作就和栈的pop()操作一样了。
用数组实现优先队列:(insert已经进行有序操作。pop操作即为peekMax,remove操作)
public class PriorityQ {
private int maxSize;
private long[] queArray;
private int nItems;
//constructor
public PriorityQ(int s){
maxSize = s;
queArray = new long[maxSize];
nItems = 0;
}
//insert
public void insert(long item){
int j;
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;
}//end for
queArray[j+1] = item;
nItems++;
}//end else
}
public long remove(){
return queArray[--nItems];
}
public long peekMin(){
return queArray[nItems - 1];
}
public long peekMax(){
return queArray[0];
}
public boolean isEmpty(){
return nItems == 0;
}
public boolean isFull(){
return nItems == maxSize;
}
}