使用 Java 的 DSA - 优先级队列
概述
优先级队列是一种比队列更专业的数据结构。与普通队列一样,优先级队列具有相同的方法,但有一个主要区别。在优先级队列中,项目按键值排序,因此键值最低的项目位于前面,键值最高的项目位于后面,反之亦然。因此,我们根据项目的键值为其分配优先级。值越低,优先级越高。以下是优先级队列的主要方法。
基本操作
插入/入队 − 将项目添加到队列后面。
删除/出队 −从队列前面删除一个项目。
优先级队列表示
在本文中,我们将使用数组实现队列。队列支持以下几个操作。
Peek − 获取队列前面的元素。
isFull − 检查队列是否已满。
isEmpty − 检查队列是否为空。
插入/入队操作
每当将元素插入队列时,优先级队列都会按照其顺序插入项目。这里我们假设价值高的数据优先级较低。
public void insert(int data){
int i =0;
if(!isFull()){
// 如果队列为空,则插入数据
if(itemCount == 0){
intArray[itemCount++] = data;
}else{
// 从队列的右端开始
for(i = itemCount - 1; i >= 0; i-- ){
// 如果数据较大,则将现有项目移至右端
if(data > intArray[i]){
intArray[i+1] = intArray[i];
}else{
break;
}
}
// 插入数据
intArray[i+1] = data;
itemCount++;
}
}
}
移除/出队操作
每当要从队列中移除元素时,队列都会使用项目计数获取元素。一旦元素被移除。项目计数减少一。
public int remove(){
return intArray[--itemCount];
}
优先级队列实现
PriorityQueue.java
package com.tutorialspoint.datastructure;
public class PriorityQueue {
private final int MAX;
private int[] intArray;
private int itemCount;
public PriorityQueue(int size){
MAX = size;
intArray = new int[MAX];
itemCount = 0;
}
public void insert(int data){
int i =0;
if(!isFull()){
// 如果队列为空,则插入数据
if(itemCount == 0){
intArray[itemCount++] = data;
}else{
// 从队列的右端开始
for(i = itemCount - 1; i >= 0; i-- ){
// 如果数据较大,则将现有项目移至右端
if(data > intArray[i]){
intArray[i+1] = intArray[i];
}else{
break;
}
}
// 插入数据
intArray[i+1] = data;
itemCount++;
}
}
}
public int remove(){
return intArray[--itemCount];
}
public int peek(){
return intArray[itemCount - 1];
}
public boolean isEmpty(){
return itemCount == 0;
}
public boolean isFull(){
return itemCount == MAX;
}
public int size(){
return itemCount;
}
}
演示程序
PriorityQueueDemo.java
package com.tutorialspoint.datastructure;
public class PriorityQueueDemo {
public static void main(String[] args){
PriorityQueue queue = new PriorityQueue(6);
//insert 5 items
queue.insert(3);
queue.insert(5);
queue.insert(9);
queue.insert(1);
queue.insert(12);
// ------------------
// index : 0 1 2 3 4
// ------------------
// queue : 12 9 5 3 1
queue.insert(15);
// ---------------------
// index : 0 1 2 3 4 5
// ---------------------
// queue : 15 12 9 5 3 1
if(queue.isFull()){
System.out.println("Queue is full!");
}
//remove one item
int num = queue.remove();
System.out.println("Element removed: "+num);
// ---------------------
// index : 0 1 2 3 4
// ---------------------
// queue : 15 12 9 5 3
//insert more items
queue.insert(16);
// ----------------------
// index : 0 1 2 3 4 5
// ----------------------
// queue : 16 15 12 9 5 3
//As queue is full, elements will not be inserted.
queue.insert(17);
queue.insert(18);
// ----------------------
// index : 0 1 2 3 4 5
// ----------------------
// queue : 16 15 12 9 5 3
System.out.println("Element at front: "+queue.peek());
System.out.println("----------------------");
System.out.println("index : 5 4 3 2 1 0");
System.out.println("----------------------");
System.out.print("Queue: ");
while(!queue.isEmpty()){
int n = queue.remove();
System.out.print(n +" ");
}
}
}
如果我们编译并运行上述程序,则会产生以下结果 −
Queue is full! Element removed: 1 Element at front: 3 ---------------------- index : 5 4 3 2 1 0 ---------------------- Queue: 3 5 9 12 15 16

