- Java DSA 教程
- Java实现的DSA - 首页
- Java实现的DSA - 概述
- Java实现的DSA - 环境搭建
- Java实现的DSA - 算法
- Java实现的DSA - 数据结构
- Java实现的DSA - 数组
- Java实现的DSA - 链表
- Java实现的DSA - 双向链表
- Java实现的DSA - 循环链表
- Java实现的DSA - 栈
- DSA - 表达式解析
- Java实现的DSA - 队列
- Java实现的DSA - 优先队列
- Java实现的DSA - 树
- Java实现的DSA - 哈希表
- Java实现的DSA - 堆
- Java实现的DSA - 图
- Java实现的DSA - 搜索技术
- Java实现的DSA - 排序技术
- Java实现的DSA - 递归
- Java实现的DSA - 有用资源
- Java实现的DSA - 快速指南
- Java实现的DSA - 有用资源
- Java实现的DSA - 讨论
Java实现的DSA - 优先队列
概述
优先队列比普通队列更专业。与普通队列一样,优先队列具有相同的方法,但有一个主要区别。在优先队列中,项目按键值排序,键值最小的项目位于队列前端,键值最大的项目位于队列后端,反之亦然。因此,我们根据项目的键值赋予其优先级。值越低,优先级越高。以下是优先队列的主要方法。
基本操作
插入/入队 − 将项目添加到队列的尾部。
删除/出队 − 从队列的头部删除项目。
优先队列表示
在本文中,我们将使用数组实现队列。队列还支持一些其他操作,如下所示。
查看 − 获取队列头部元素。
是否已满 − 检查队列是否已满。
是否为空 − 检查队列是否为空。
插入/入队操作
每当将元素插入队列时,优先队列会根据其顺序插入该元素。这里我们假设值较大的数据优先级较低。
public void insert(int data){ int i =0; if(!isFull()){ // if queue is empty, insert the data if(itemCount == 0){ intArray[itemCount++] = data; }else{ // start from the right end of the queue for(i = itemCount - 1; i >= 0; i-- ){ // if data is larger, shift existing item to right end if(data > intArray[i]){ intArray[i+1] = intArray[i]; }else{ break; } } // insert the data 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 queue is empty, insert the data if(itemCount == 0){ intArray[itemCount++] = data; }else{ // start from the right end of the queue for(i = itemCount - 1; i >= 0; i-- ){ // if data is larger, shift existing item to right end if(data > intArray[i]){ intArray[i+1] = intArray[i]; }else{ break; } } // insert the data 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
广告