- 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
廣告