优先级队列是不同于先进先出队列的另一种队列。每次去队列的是具有最高优先权的元素。
下载源码:
import java.util.Comparator;
public class PriorityQ<T>
{
private final int SIZE = 20;
private T[] queArray;
private int size;
private final Comparator<? super T> comparator;
public PriorityQ(Comparator<? super T> comparator)
{
queArray = (T[])new Object[SIZE];
this.comparator=comparator;
size = 0;
}
//添加一项,优先级最高的放在数组尾部(队列头部)
public void add(T item)
{
if(isFull()) doubleArray();
int j;
for(j=0; j<size; j++) //找到插入的位置
if( comparator.compare(item,queArray[j])>=0)
break;
for(int k=size-1; k>=j; k--) //移动
queArray[k+1] = queArray[k];
queArray[j] = item;
size++;
}
public void offer(T item){
add(item);
}
//在队列头删除优先级最高的元素并返回
public T poll()
{ return queArray[--size]; }
//从此队列中移除指定元素的单个实例
public boolean remove(T t) {
int i= find(t);
if(i==-1) return false;
removeN(i);
return true;
}
//在优先队列中删除索引为n的项
public void removeN(int n)
{
for(int j=n; j<size-1; j++) // move items down
queArray[j] = queArray[j+1];
size--;
}
//获取但不移除此队列的头
public T peek()
{ return queArray[size-1]; }
public int size()
{ return size; }
public boolean isEmpty()
{ return (size==0); }
public void clear(){
size=0;
}
public T peekN(int n)
{ return queArray[n]; }
public int find(T t)
{
for(int j=0; j<size; j++)
if(comparator.compare(queArray[j],t)==0)
return j;
return -1;
}
private boolean isFull(){
return size==queArray.length;
}
private void doubleArray(){
T [] oldQueue = queArray;
int oldSize = queArray.length;
queArray =(T[])new Object[2*oldSize];
for(int index = 0;index<oldSize;index++){
queArray[index] = oldQueue[index];
}
}
public void display(){
if(size==0) {System.out.println("没有了");return;}
for(int i=0;i<size;i++)
System.out.print(queArray[i]+",");
System.out.println();
}
public static void main(String args[]){
PriorityQ Q=new PriorityQ(new Comparator(){
public int compare(Object o1,Object o2) {
Integer I1=(Integer)o1;
Integer I2=(Integer)o2;
return I1.compareTo(I2);
}
});
for(int i=110;i>0;i--)
Q.offer(new Integer(java.util.concurrent.ThreadLocalRandom.current().nextInt(40)));
Q.display();
System.out.println("===============================");
for(int i=10;i>0;i--)
Q.poll();
Q.display();
System.out.println("===============================");
Q.remove(35);
Q.display();
}
}
下载源码: