文章目录
优先级队列介绍
普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。
在优先队列中,元素被赋予优先级。在插入元素时,要按照优先级找到正确的位置并插入。
实现一个简单的优先级队列
数值的大小作为优先级,数值越大优先级越高。
插入:根据元素的大小插入。
取出:取出队头元素。
在这里插入代码片package queue;
public class QueueTest3 {
public static void main(String[] args) {
PriorityQueue queue = new PriorityQueue(3);
queue.insert(1);
queue.insert(100);
queue.insert(23);
queue.insert(25);
// System.out.println(queue.peek());
while (!queue.isEmpty()){
System.out.println(queue.removeHeader());
}
}
}
class PriorityQueue{
private int[] elements;
private int maxSize;
private int nElems;
public PriorityQueue(int size){
elements = new int[size];
maxSize = size;
nElems = 0;
}
//插入数据
public void insert(int data){
if(nElems==0){//空队列
elements[nElems++] = data;
} else if(nElems != maxSize){
int j = nElems-1;
while(j>=0 && data>elements[j]){
//队列从大到小排序,所以从后向前遍历队列,如果队列中的元素比data小,就把元素往后移动
elements[j+1] = elements[j];
j--;
}
elements[j+1] = data;
nElems ++;
}
}
//读队尾数据
public int peek(){
if(nElems != 0){
return elements[nElems-1];
}else{
return -1; //我们设定-1表示没数据
}
}
// //取出数据,取出队尾的一个元素
// public int remove(){
// int removeData = -1;
// if(nElems != 0){
// removeData = elements[nElems-1];
// elements[nElems-1] = -1;//-1表示没有元素
// nElems--;
// }
// return removeData;
// }
//取出数据,取出队头的一个元素
public int removeHeader(){
int removeData = -1;
if(nElems != 0){
removeData = elements[0];
for(int i=0;i<nElems-1;i++){
elements[i] = elements[i+1];
}
elements[nElems-1] = -1;//-1表示没有元素
nElems--;
}
return removeData;
}
//判断是否为空
public boolean isEmpty(){
return (nElems == 0);
}
}