优先级队列是比栈和队列更加有用的数据结构。
跟普通的队列一样,优先级队列也有队头和队尾,并且也是从一端进,一端出。
但是不一样的地方是,优先级队列的值是有序的。
如此一来,关键字最小的数据项(或最大的)总是队列的一端。
在数据项很少或者不太关系速度的情况下,用数组实现优先队列还可以满足。
如果数据项很多,或者速度很快,采用堆是更好的选择。
这次代码以最大的关键字放在队头。
package DataStructure;
/**
* Created by Hubbert on 2017/11/14.
*/
/*
优先级队列
从大到小排列.
[0....n]
[max...min]
*/
public class PriorityQ {
private int [] arr;
private int maxSize;
private int nItems;
public PriorityQ( int maxSize ){
this.maxSize = maxSize ;
arr = new int[maxSize];
nItems = 0 ;
}
//insert
public void insert( int number ){
//当队列还是为空时
if( nItems == 0 ){
arr[nItems++] = number ;
} else {
int i;
for ( i = nItems - 1; i >= 0 ; i-- ) {
if( number > arr[i] ){ //如果插入的数据比前一个大
arr[i+1] = arr[i]; //把前一个赋值到当前位置
}else {
break;//如果当前值比前一个值大,则直接break;防止继续i--
}
}
arr[i+1] = number ;
//每次增加,记得加nItems++;
nItems++;
}
}
//remove
public int remove () {
//每次移除,记得加nItems--;
return arr[--nItems];
}
public boolean isFull(){
return (nItems == maxSize);
}
public boolean isEmpty(){
return (nItems == 0) ;
}
public static void main(String [] args){
PriorityQ pq = new PriorityQ(5);
pq.insert(22);
pq.insert(88);
pq.insert(99);
pq.insert(20);
pq.insert(11);
while (! pq.isEmpty()) {
System.out.print(pq.remove() + " ");
}
}
}
结果如图所示: