欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java基于堆结构实现优先队列功能示例

程序员文章站 2024-04-01 19:30:28
本文实例讲述了java基于堆结构实现优先队列功能。分享给大家供大家参考,具体如下: package demo; import java.util.nosuche...

本文实例讲述了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数据结构与算法教程》、《java操作dom节点技巧总结》、《java文件与目录操作技巧汇总》和《java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。