您的位置:首页 > 编程语言 > Java开发

java使用堆结构实现优先队列

2015-05-30 17:07 806 查看
package com.structures.tree;

import java.util.NoSuchElementException;

/*
* 小顶堆 java使用堆结构实现优先队列
* http://www.oschina.net/code/snippet_855019_15069 */
public class JPriorityQueue<E> {

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();
}
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];
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--;
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];
Comparable<? super E> comproot = (Comparable<? super E>) root;
if (comproot.compareTo(node.queue[left]) < 0
&& comproot.compareTo(node.queue[right]) < 0)
break;
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) {
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());

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: