Java基于堆結(jié)構(gòu)實(shí)現(xiàn)優(yōu)先隊(duì)列功能示例
本文實(shí)例講述了Java基于堆結(jié)構(gòu)實(shí)現(xiàn)優(yōu)先隊(duì)列功能。分享給大家供大家參考,具體如下:
package Demo;
import java.util.NoSuchElementException;
/*
* 小頂堆 java使用堆結(jié)構(gòu)實(shí)現(xiàn)優(yōu)先隊(duì)列
*/
public class JPriorityQueue<E> {
@SuppressWarnings("hiding")
class QueueNode<E> {
int capacity;
int size;
E[] queue;
QueueNode(int capacity) {
this.capacity = capacity;
}
}
QueueNode<E> node;
public void print()
{
E[] objs=this.node.queue;
for(int i=0;i<this.node.size;i++)
{
System.out.print(objs[i]+" ");
}
System.out.println();
}
@SuppressWarnings("unchecked")
public JPriorityQueue(int capacity) {
node = new QueueNode<E>(capacity);
node.size = 0;
node.queue = (E[]) new Object[capacity + 1];
}
public void add(E x) {
int k = node.size;
while (k > 0) {
int parent = (k - 1) / 2;
E data = node.queue[parent];
@SuppressWarnings({ "unchecked", "rawtypes" })
Comparable<E> key = (Comparable) x;
if (key.compareTo(data) >= 0)
break;
node.queue[k] = data;
k = parent;
}
node.queue[k] = x;
node.size++;
}
public E remove() {
int parent = 0;
if (node.size == 0) {
throw new NoSuchElementException("queue is null");
}
E min = node.queue[0];// top
E last = node.queue[node.size - 1];// last
node.queue[0] = last;// add the last to top
node.queue[node.size - 1] = null;
node.size--;
@SuppressWarnings("unchecked")
Comparable<? super E> complast = (Comparable<? super E>) last;
if (node.size == 2 && complast.compareTo(node.queue[1]) > 0) { // 只剩下最后兩個(gè)結(jié)點(diǎn),進(jìn)行比較
node.queue[0] = node.queue[1];
node.queue[1] = last;
}
if (node.size > 2) { // 大于三個(gè)結(jié)點(diǎn)的,向下旋轉(zhuǎn)
while (parent < node.size / 2) {
int left = 2 * parent + 1;// left child
int right = left + 1;// right child
E root = node.queue[parent];
@SuppressWarnings("unchecked")
Comparable<? super E> comproot = (Comparable<? super E>) root;
if (comproot.compareTo(node.queue[left]) < 0
&& comproot.compareTo(node.queue[right]) < 0)
break;
@SuppressWarnings("unchecked")
Comparable<? super E> compleft = (Comparable<? super E>) node.queue[left];
if (compleft.compareTo(node.queue[right]) <= 0) {
node.queue[parent] = node.queue[left];
node.queue[left] = root;
parent = left;
} else {
node.queue[parent] = node.queue[right];
node.queue[right] = root;
parent = right;
}
if (right * 2 >= node.size)
break;
}
}
return min;
}
public static void main(String[] args) {
System.out.println("腳本之家測試結(jié)果:");
JPriorityQueue<String> queue = new JPriorityQueue<String>(10);
queue.add("Z");
queue.add("B");
queue.add("QZA");
queue.add("QBA");
queue.add("EAA");
queue.add("A");
queue.print();
// queue.remove();
// queue.remove();
// queue.remove();
// queue.remove();
// queue.remove();
System.out.println(queue.remove());
System.out.println(queue.remove());
System.out.println(queue.remove());
System.out.println(queue.remove());
System.out.println(queue.remove());
System.out.println(queue.remove());
}
}
運(yùn)行結(jié)果:

更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計(jì)有所幫助。
- Java數(shù)據(jù)結(jié)構(gòu)之堆(優(yōu)先隊(duì)列)的實(shí)現(xiàn)
- Java優(yōu)先隊(duì)列?priority?queue
- java數(shù)據(jù)結(jié)構(gòu)-堆實(shí)現(xiàn)優(yōu)先隊(duì)列
- Java優(yōu)先隊(duì)列(PriorityQueue)重寫compare操作
- java優(yōu)先隊(duì)列PriorityQueue中Comparator的用法詳解
- Java的優(yōu)先隊(duì)列PriorityQueue原理及實(shí)例分析
- java編程實(shí)現(xiàn)優(yōu)先隊(duì)列的二叉堆代碼分享
- Java數(shù)據(jù)結(jié)構(gòu)優(yōu)先隊(duì)列實(shí)練
相關(guān)文章
IntelliJ IDEA自定義代碼提示模板Live Templates的圖文教程
這篇文章主要介紹了IntelliJ IDEA自定義代碼提示模板Live Templates,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
java中實(shí)現(xiàn)map與對象相互轉(zhuǎn)換的幾種實(shí)現(xiàn)
這篇文章主要介紹了java中實(shí)現(xiàn)map與對象相互轉(zhuǎn)換的幾種實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
java實(shí)現(xiàn)手機(jī)短信驗(yàn)證的基本思路
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)手機(jī)短信驗(yàn)證的基本思路,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
POI讀取excel簡介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了POI讀取excel簡介,詳細(xì)的介紹了什么是Apache POI和組件,有興趣的可以了解了解一下2017-08-08
解決微服務(wù)下Mybatis?xml無效綁定問題及分析Invalid?bound?statement
這篇文章主要介紹了解決微服務(wù)下Mybatis?xml無效綁定問題及分析Invalid?bound?statement,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11

