时间:2021-05-20
本文实例讲述了Java基于堆结构实现优先队列功能。分享给大家供大家参考,具体如下:
package Demo;import java.util.NoSuchElementException;/* * 小顶堆 java使用堆结构实现优先队列 */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) { // 只剩下最后两个结点,进行比较 node.queue[0] = node.queue[1]; node.queue[1] = last; } if (node.size > 2) { // 大于三个结点的,向下旋转 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("测试结果:"); 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()); }}运行结果:
更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
优先队列的二叉堆实现在前面的章节里我们学习了“先进先出”(FIFO)的数据结构:队列(Queue)。队列有一种变体叫做“优先队列”(PriorityQueue)
PriorityQueue是从JDK1.5开始提供的新的数据结构接口,它是一种基于优先级堆的极大优先级队列。优先级队列是不同于先进先出队列的另一种队列。每次从队
这里主要介绍的是优先队列的二叉堆Java实现,代码如下:packagepractice;importedu.princeton.cs.algs4.StdRand
我们期望的数据结构能支持插入操作,并能方便地从中取出具有最小或最大关键码的记录,这样的数据结构即为优先级队列。在优先级队列的各种实现中,堆是最高效的一种数据
本文实例讲述了JavaScript数据结构之优先队列与循环队列。分享给大家供大家参考,具体如下:优先队列实现一个优先队列:设置优先级,然后在正确的位置添加元素。