和栈和队列一样,优先级队列也是一种编程常用的数据结构,很多情况下我们总是需要访问关键字最小的数据项(比如在图的最小生成树算法中),又或者总是要访问关键字最大的数据项(比如在抢先式多任务操作系统中优先级最高的程序优先得到时间片运行)。这个时候我们可以采用优先级队列这种数据结构。
优先级队列的特点在于可以快速访问具有最高关键字的数据项(以后一种为例),因此优先级队列可以采用堆来实现,他不仅可以实现快速访问而且可以实现快速插入,此处由于数据量比较少,也可以采用简单的数组来实现,因为它比较简单,所以插入速度不是很快。
代码:
1、构建优先级队列对象
public class PriorityQueue {
int[] queue;
int index = 0;
//length为队列的最长限制
public PriorityQueue(int length) {
if (length <= 0) {
return;
} else {
queue = new int[length];
}
}
// 1、插入操作
public void insert(int value) {
if(index == 0){
queue[index]= value;
}else if(index>=queue.length) {
return;
}else {
int i = index-1;
while(i>=0){
if(queue[i]>value){
break;
}else {
queue[i+1]=queue[i];
i--;
}
}
queue[i+1]=value;
}
index++;
}
// 2、删除操作
public void remove() {
if (index <= 0) {
return;
} else if (index == 1) {
index--;
} else {
for (int i = 1; i < index; i++) {
queue[i - 1] = queue[i];
}
index--;
}
}
// 3查看操作
public int peekMax() {
if (index <= 0) {
return -1;
} else {
return queue[0];
}
}
}
//测试代码
public class Test {
public static void main(String[] args) {
PriorityQueue queue = new PriorityQueue(10);
for(int i =0;i<10;i++){
int value = (int)(Math.random()*1000);
queue.insert(value);
System.out.print(value+" ");
}
System.out.println("\n-------------------------------------------------------------");
for(int i =0 ;i<10;i++){
System.out.print(queue.peekMax()+" ");
queue.remove();
}
}
}