优先级队列
优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了。这样,我们就引入了优先级队列 这种数据结构。 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有:查找、插入、删除; 一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 。对于优先权相同的元素,可按先进先出次序处理或按任意优先权进行。
Java代码:
public class PriorityQueue {
private long[] arr = null;
private int nItems = 0;
private int maxSize = 0;
public PriorityQueue(int maxSize) {
arr = new long[maxSize];
this.maxSize = maxSize;
nItems = 0;
}
/**
*优先级队列的插入不是队尾,而是选择一个合适的按照某种顺序插入的
* (1)当队列长度为0时,插到第一个单元中
* (2)队列长度不为0时,将所有比要插入的数小的数据后移,这样大的数就在队列的头部了
*/
public void insert(long key)
{
int i = 0;
if (nItems == 0){
arr[nItems++] = key;
}else{
for (i=nItems-1;i>=0;i--){
if (key>arr[i]){
arr[i+1] = arr[i];
}else{
break;
}
}
arr[i+1] = key;
nItems++;
}
}
//移出的是数组最上端的数,这样减少数组元素的移动
public long remove()
{
return arr[--nItems];
}
//判断队列是否为空
public boolean isEmpty()
{
return (nItems == 0);
}
//判断队列是否为满
public boolean isFull()
{
return (nItems == maxSize);
}
//返回队列长度
public int size()
{
return nItems;
}
//获取最小数(优先级最高)
public long getPeekMin(){
return arr[nItems -1];
}
//输出队列
public void diaplayPQ(){
for(int i = nItems- 1;i >= 0;i--){
System.out.print(arr[i] + " ");
}
System.out.println();
}
}