java实现优先级队列
2016-10-31 20:48
363 查看
优先级队列是一种带有优先级的队列,我们约定关键字最小的数据元素具有最高的优先级,且总是排在队首。
在优先级中的数据元素也不仅仅限制在队尾进行,而是顺序插入到合适的位置,以确保队列的优先级顺序。
实现只有在入队的时候和队列又些区别,用到了之前写的结点Node类
队列接口:
优化结点的data类:
实现IQueue的优先级队列:
测试:
输出:
在优先级中的数据元素也不仅仅限制在队尾进行,而是顺序插入到合适的位置,以确保队列的优先级顺序。
实现只有在入队的时候和队列又些区别,用到了之前写的结点Node类
队列接口:
package queueTest; public interface IQueue { public void clear(); public boolean isEmpty(); public int length(); public Object peek();// 取队首元素 public void offer(Object x) throws Exception;// 入队 public Object poll();// 出队 public void display(); }
优化结点的data类:
package queueTest; public class PriorityQData { //结点的data类 public Object elem;//结点的数据元素值 public int priority;//结点的优先级 public PriorityQData(Object elem, int priority) { this.elem = elem; this.priority = priority; } }
实现IQueue的优先级队列:
package queueTest; import linearList.Node; public class PriorityQueue implements IQueue { private Node front;//队首的引用 private Node rear;//队尾的引用 public PriorityQueue() { front=rear=null; } @Override public void clear() { front=rear=null; } @Override public boolean isEmpty() { return front==null; } @Override public int length() { Node p=front; int length=0; while(p!=null){ p=p.next; length++; } return length; } @Override public Object peek() { if(front==null){ return null; } else{ return front.data; } } @Override public void offer(Object x) throws Exception { PriorityQData pn=(PriorityQData)x; Node s=new Node(pn);//构造数据域为pn的结点 if(front==null){ front=rear=s; } else { Node p=front; Node q=front; while(p!=null&&pn.priority>=((PriorityQData)p.data).priority){ q=p; p=p.next; } if(p==null){ rear.next=s; rear=s; } else if (p==front) { s.next=front; front=s; } else { q.next=s; s.next=p; } } } @Override public Object poll() { if(front==null){ return null; } else{ return front.data; } } @Override public void display() { if(!isEmpty()){ Node p=front; while(p!=rear.next){ PriorityQData q=(PriorityQData)p.data; System.out.println(q.elem+" "+q.priority); p=p.next; } } else { System.out.println("此队列为空"); } } }
测试:
package queueTest; public class ProcessManagement { public static void main(String[] args) throws Exception { PriorityQueue pm=new PriorityQueue(); pm.offer(new PriorityQData(1, 20)); pm.offer(new PriorityQData(2, 30)); pm.offer(new PriorityQData(3, 20)); pm.offer(new PriorityQData(4, 20)); pm.offer(new PriorityQData(5, 40)); pm.offer(new PriorityQData(6, 10)); pm.display(); } }
输出:
6 10 1 20 3 20 4 20 2 30 5 40
相关文章推荐
- java实现 数据结构:链表、 栈、 队列、优先级队列、哈希表
- Java优先级队列实现
- 循环队列与优先级队列的Java实现
- java开发系统内核:实现进程优先级队列
- java创建优先级队列及增删改查实现
- java实现 数据结构:链表、 栈、 队列、优先级队列、哈希表
- 用堆实现优先级队列--Java
- 数据结构Java实现——②队列-->队列的“奇葩”二 优先级队列
- 优先级队列的Java ,C++ STL,堆实现
- Java优先级队列实现
- 第6章 堆排序 java实现 简单版 泛型版 最大优先级队列
- 用堆实现优先级队列 Java实现
- 堆排序及优先级队列Java实现
- java使用数组实现优先级队列
- java之中PriorityQueue实现原理(具有优先级的队列)
- java中关于优先级队列的实现
- 算法导论Java实现-优先级队列(6.5章节)
- 【java基础】阻塞队列,优先级队列实现方式
- java中关于优先级队列的实现
- java基于有序链表的优先级队列实现