优先级队列定义:
如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了。这样,我们就引入了优先级队列 这种数据结构。 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素 (3)删除 一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 。对于优先权相同的元素,可按先进先出次序处理或按任意优先权进行。
优先权:
优先队列是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有:
- 查找;
- 插入一个新元素;
- 删除.
在最小优先队列(min priorityq u e u e)中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素;对于最大优先队列(max priority queue),查找操作用来搜索优先权最大的元素,删除操作用来删除该元素.优先权队列中的元素可以有相同的优先权,查找与删除操作可根据任意优先权进行.
代码实现:
首先创建一个优先级队列类PriorityQueue
public class PriorityQueue {
//数组
private long[] arr;
//最大空间
private int MaxSize;
//有效元素
private int elems;
//构造方法
public PriorityQueue(int MaxSise){
this.MaxSize=MaxSise;
arr=new long[MaxSise];
elems=0;
}
//插入数据(插入方式为最大优先插入)
public void insert(long value){
int i;
for (i=0;i<elems;i++){
if (value>arr[i]){
break;
}
}
for (int j=elems;j>i;j--){
arr[j]=arr[j-1];
}
arr[i]=value;
elems++;
}
//移除数据
public long remove(){
//从最后一项开始移除数据
long value=arr[elems-1];
elems--;
return value;
}
//是否为空
public boolean isEmpty(){
return (elems==0);
}
//是否为满
public boolean isFull(){
return (MaxSize==elems);
}
//返回元素大小
public int size(){
return elems;
}
}
创建测试类(TestPQ)进行测试:
public class TestPQ {
public static void main(String[] args){
PriorityQueue priorityQueue=new PriorityQueue(5);
//插入数据
priorityQueue.insert(23);
priorityQueue.insert(45);
priorityQueue.insert(12);
priorityQueue.insert(49);
priorityQueue.insert(65);
//判断队列是否为空,如果不为空,输出队列元素
while(!priorityQueue.isEmpty()){
System.out.print(priorityQueue.remove()+" ");
}
}
}
结果展示:
输出结果从小到大依次输出