队列的特点是先进先出。通常都把队列比喻成排队买东西,大家都很守秩序,先排队的人就先买东西。但是优先队列有所不同,它不遵循先进先出的规则,而是根据队列中元素的优先权,优先权最大的先被取出。这就很像堆的特征:总是移除优先级最高的根节点。

重点:优先级队列,是要看优先级的,谁的优先级更高,谁就先得到权限。不分排队的顺序!

上篇文章解释了堆的概念实现,现在用堆实现优先队列:

//最大堆
import java.util.ArrayList;
public class Heap<E extends Comparable>{private ArrayList<E> list=new ArrayList<E>();//用数组实现堆public Heap(){}public Heap(E[] objects){for(int i=0;i<objects.length;i++){add(objects[i]);}}public void add(E newObject){//添加一个元素list.add(newObject);int currentIndex=list.size()-1;while(currentIndex>0){int parentIndex=(currentIndex-1)/2;//找到该结点的父结点if(list.get(currentIndex).compareTo(list.get(parentIndex))>0){//与父节点比较//如果当前结点的值大于父结点就交换位置E temp=list.get(currentIndex);list.set(currentIndex, list.get(parentIndex));list.set(parentIndex, temp);               }elsebreak;currentIndex=parentIndex;}      }public E remove(){//删除并返回根结点,堆的特点是移除了根结点后还是堆if(list.size()==0) return null;E removeObject=list.get(0);list.set(0, list.get(list.size()-1));//把最后一个结点放在根结点的位置list.remove(list.size()-1);int currentIndex=0;while(currentIndex<list.size()){int leftChildIndex=2*currentIndex+1;int rightChildIndex=2*currentIndex+2;//左右孩子结点的坐标if(leftChildIndex>=list.size())break;//比较左右孩子的值,使maxIndex指向值大的结点int maxIndex=leftChildIndex;if(rightChildIndex<list.size()){if(list.get(maxIndex).compareTo(list.get(rightChildIndex))<0){maxIndex=rightChildIndex;}}//如果当前结点的值小于其左右孩子中的大的值,就交换两个结点if(list.get(currentIndex).compareTo(list.get(maxIndex))<0){E temp=list.get(maxIndex);list.set(maxIndex, list.get(currentIndex));list.set(currentIndex, temp);currentIndex=maxIndex;}elsebreak;}return removeObject;     }public int getSize(){return list.size();}}

MyPriorityQueue.java

public class MyPriorityQueue<E extends Comparable> {private Heap<E> heap=new Heap<E>();//用堆实现优先队列//入队列public void enqueue(E e){heap.add(e); //这个add以后,堆会自己调整成一个新堆}//出队列public E dequeue(){return heap.remove();//这移除出之后,堆会自己调整,还是一个新堆}public int getSize(){return heap.getSize();}}

TestMyPriorityQueueMainClass.java

public class TestMyPriorityQueueMainClass {public static void main(String[] args) {// TODO Auto-generated method stubPatient p1=new Patient("John",2);Patient p2=new Patient("Tom",9);Patient p3=new Patient("Jack",4);Patient p4=new Patient("Michael",6);MyPriorityQueue<Patient> priorityQueue=new MyPriorityQueue<>();priorityQueue.enqueue(p1);priorityQueue.enqueue(p2);priorityQueue.enqueue(p3);priorityQueue.enqueue(p4);while(priorityQueue.getSize()>0){System.out.print(priorityQueue.dequeue()+"  ");}}static class Patient implements Comparable{private String name;private int priority;public Patient(String name,int priority){this.name=name;this.priority=priority;}public String toString(){return name+"(priority:"+priority+")";}@Overridepublic int compareTo(Object oo) {//比较优先级// TODO Auto-generated method stub         return this.priority-((Patient)oo).priority;}}
}

测试结果: 优先级高的先输出,优先级最高的就是堆的根节点

数据结构-堆实现优先队列(java)相关推荐

  1. 【从蛋壳到满天飞】JS 数据结构解析和算法实现-堆和优先队列(一)

    前言 [从蛋壳到满天飞]JS 数据结构解析和算法实现,全部文章大概的内容如下: Arrays(数组).Stacks(栈).Queues(队列).LinkedList(链表).Recursion(递归思 ...

  2. 数据结构之堆与优先队列

    堆与优先队列: 堆 堆必须是一个完全二叉树.除了最后一层,其他层的节点个数都是满的,最后一层的节点都靠左排列 堆中的每个节点的值必须大于等于(或者小于等于)其子树中每个节点的值或者说堆中每个节点的值都 ...

  3. 优先队列-二叉堆-堆排序原理-Java相关API

    完全二叉树概念 除了最后一层,前面所有层都是满的 最后一层是从左到右 是一个二叉树 堆 满足完全二叉树 父节点存储的元素比子节点大 上浮 不符合堆规则的节点,与父节点交换 直到上浮到符合为止 下沉 不 ...

  4. java堆 数据结构 堆_Java中的紧凑堆外结构/组合

    java堆 数据结构 堆 在上一篇文章中,我详细介绍了代码对主内存的访问方式的含义. 从那时起,我就在Java中可以做什么以实现更可预测的内存布局提出了很多疑问. 有些模式可以使用数组支持的结构来应用 ...

  5. 数据结构与算法——二叉树、堆、优先队列

    *************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 七 ...

  6. 数据结构-堆 Java实现

    数据结构-堆 Java实现. 实现堆自动增长 1 /** 2 * 数据结构-堆. 自动增长 3 * 4 * @author caiyao 5 */ 6 public class Heap<T e ...

  7. java堆 数据结构 堆_快速堆数据结构

    java堆 数据结构 堆 In this tutorial, we'll be discussing and implementing Heap data structures in Swift. 在 ...

  8. [重修数据结构0x03]并查集、堆、优先队列(2021.8.11)

    前言 在做遍历的题目的时候,发现掌握一些特殊的数据结构和技巧有时对解决题目有着决定性的作用,不可不学.因此特地拿出来两天学习一下并查集.堆.优先队列.以后有更多思考和感悟再加补充吧.内容来自算法笔记, ...

  9. 【数据结构】堆,大根堆,小根堆,优先队列 详解

    目录 堆 1.堆的数组实现 2.小根堆 3.大根堆 4.优先队列 例题 1.SP348 EXPEDI - Expedition(有趣的贪心思路,优先队列) 2.合并果子 堆 要了解堆之前,请先了解树, ...

最新文章

  1. 啥是佩奇?Python告诉你
  2. java自定义sql查询插件,Mybatis插件plugin应用测试,替换查询sql
  3. mysql字符调整_mysql字符集调整
  4. 8、mysql数据表中数据的增删改
  5. 在Ubuntu中搭建.NET开发环境
  6. 1.3编程基础之算术表达式与顺序执行 12 计算球的体积
  7. 中国铁路官宣:高铁Wi-Fi将融合5G技术
  8. txt格式转换成prg_用批处理打印磁盘上所有的.PRG文件
  9. VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator
  10. [RMAN]使用RMAN删除过期归档日志
  11. x264源代码简单分析:x264_slice_write()
  12. java中的.take(),Rxjava2~take~timer~interval~buffer~filter等源码如何实现(你应该懂的)~学渣带你扣rxjava2...
  13. 用nodejs框架Ghost快速搭建自己的网站
  14. Unity 打包微信
  15. 「ggplot2练习」画基因结构图
  16. Maven项目右边依赖好多红色波浪线处理办法
  17. 浏览器导出ssl证书导入jdk
  18. 广告主流量主怎么申请(微信)
  19. 产品思维的修炼–技术的必修课
  20. 世界上有哪几大杀毒软件??

热门文章

  1. Prototype Pattern(原型模式)
  2. 2 Docker安装及使用
  3. Bitcoin0.21版 公链开发(4) Apache windows上安装
  4. DFS算法走迷宫(python实现)
  5. BUUCTF--[GWCTF 2019]re3学习记录
  6. [JAVA基础] 了解构造器Constructor———你真的会用构造器吗?
  7. 用Go语言建立一个简单的区块链part6(2):交易(2)
  8. RtlAdjustPrivilege 一行代码提升进程权限
  9. windbg模拟器不准确现象
  10. 2020-12-6(从反汇编理解指针和引用的区别)