队列: 先进先出(FIFO)。

优先级队列: 在优先级队列中,数据项按照关键字的值有序,关键字最小的数据项总在对头,数据项插入的时候会按照顺序插入到合适的位置以确保队列的顺序,从后往前将小于插入项的数据项后移。在图的最小生成树算法中应用优先级队列。

示例代码:

  1. package chap04.Queue;
  2.  
  3. class Queue {
  4. private int maxSize;
  5. private long[] queArray;
  6. private int front;
  7. private int rear;
  8. private int nItems;
  9.  
  10. public Queue(int s) {
  11. maxSize = s;
  12. queArray = new long[maxSize];
  13. front = 0;
  14. rear = -1;
  15. nItems = 0;
  16. }
  17.  
  18. // 插入方法,队尾是数组的最后一项
  19. public void insert(long j) {
  20. if (rear == maxSize - 1) {
  21. rear = -1;
  22. }
  23. queArray[++rear] = j;
  24. nItems++;
  25. }
  26.  
  27. // 先进先出
  28. public long remove() {
  29. long temp = queArray[front++];
  30. if (front == maxSize) {
  31. front = 0;
  32. }
  33. nItems--;
  34. return temp;
  35. }
  36.  
  37. public long peekFront() {
  38. return queArray[front];
  39. }
  40.  
  41. public boolean isEmpty() {
  42. return (nItems == 0);
  43. }
  44.  
  45. public boolean isFull() {
  46. return (nItems == maxSize);
  47. }
  48.  
  49. public int size() {
  50. return nItems;
  51. }
  52. }
  53.  
  54. class PriorityQ {
  55. private int maxSize;
  56. private long[] queArray;
  57. private int nItems;
  58.  
  59. public PriorityQ(int s) {
  60. maxSize = s;
  61. queArray = new long[maxSize];
  62. nItems = 0;
  63. }
  64.  
  65. // 插入方法,从大到小排列
  66. public void insert(long item) {
  67. int j;
  68.  
  69. if (nItems == 0) {
  70. queArray[nItems++] = item;
  71. }
  72. else {
  73. for (j = nItems - 1; j >= 0; j--) {
  74. if (item > queArray[j]) { // if new item larger,
  75. queArray[j + 1] = queArray[j];
  76. }
  77. else {
  78. break;
  79. }
  80. }
  81. queArray[j + 1] = item;
  82. nItems++;
  83. }
  84. }
  85.  
  86. // 按照优先级从后往前移除,不再跟先进还是后进有关
  87. public long remove() {
  88. return queArray[--nItems];
  89. }
  90.  
  91. public long peekMin() {
  92. return queArray[nItems - 1];
  93. }
  94.  
  95. public boolean isEmpty() {
  96. return (nItems == 0);
  97. }
  98.  
  99. public boolean isFull() {
  100. return (nItems == maxSize);
  101. }
  102. }
  103.  
  104. class QueueApp {
  105. public static void main(String[] args) {
  106. Queue theQueue = new Queue(5);
  107.  
  108. theQueue.insert(10);
  109. theQueue.insert(20);
  110. theQueue.insert(30);
  111. theQueue.insert(40);
  112.  
  113. theQueue.remove();
  114. theQueue.remove();
  115. theQueue.remove();
  116.  
  117. theQueue.insert(50);
  118. theQueue.insert(60);
  119. theQueue.insert(70);
  120. theQueue.insert(80);
  121.  
  122. while (!theQueue.isEmpty()) {
  123. long n = theQueue.remove();
  124. System.out.print(n); // 40, 50, 60, 70, 80
  125. System.out.print(" ");
  126. }
  127. System.out.println("");
  128.  
  129. PriorityQ thePQ = new PriorityQ(5);
  130. thePQ.insert(30);
  131. thePQ.insert(50);
  132. thePQ.insert(10);
  133. thePQ.insert(40);
  134. thePQ.insert(20);
  135.  
  136. while (!thePQ.isEmpty()) {
  137. long item = thePQ.remove();
  138. System.out.print(item + " "); // 10, 20, 30, 40, 50
  139. }
  140. System.out.println("");
  141. }
  142. }

Java数据结构与算法(4) - ch04队列(Queue和PriorityQ)的更多相关文章

  1. Java数据结构和算法 - 栈和队列

    Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...

  2. java数据结构与算法值优先级队列

    一.优先级队列 什么是优先级队列:优先级队列是一种比栈和队列更加常用的一种数据结构.在优先级队列中,数据项按照关键字的值有序.数据项插入到队列中时,会按照顺序插入到合适的位置,用来保证队列的顺序. 生 ...

  3. java数据结构和算法03(队列和优先级队列)

    什么是队列呢?其实队列跟栈很像,我们可以把栈的底部给弄开,这样数据就可以从下面漏出来了,我们就从下面拿就好了. 可以看到队列是新进先出,就跟我们显示生活中的排队一样,买火车票,飞机票等一样,先去的肯定 ...

  4. Java数据结构与算法(3) - ch04栈(栈和转置)

    栈的基本特性是后进先出,最简单的用途是用于转置,还有其他诸如括号匹配,中序表达式(A+B*(C-D/(E+F)) --> ABCDEF+/-*+)和后续表达式(345+*612+/- --> ...

  5. Java数据结构和算法(五)——队列

    队列.queue,就是现实生活中的排队. 1.简单队列: public class Queqe { private int array[]; private int front; private in ...

  6. Java数据结构和算法(二)--队列

    上一篇文章写了栈的相关知识,而本文会讲一下队列 队列是一种特殊的线性表,在尾部插入(入队Enqueue),从头部删除(出队Dequeue),和栈的特性相反,存取数据特点是:FIFO Java中queu ...

  7. Java数据结构和算法 - OverView

    Q: 为什么要学习数据结构与算法? A: 如果说Java语言是自动档轿车,C语言就是手动档吉普.数据结构呢?是变速箱的工作原理.你完全可以不知道变速箱怎样工作,就把自动档的车子从1档开到4档,而且未必 ...

  8. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  9. Java数据结构和算法(十四)——堆

    在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...

随机推荐

  1. C++ - 内置类型的最大值宏定义

    内置类型的最大值宏定义 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24311895 C++中, 常常会使用, 某些类型的最大值 ...

  2. 【C语言探索之旅】 第二部分第二课:进击的指针,C语言的王牌!

    内容简介 1.课程大纲 2.第二部分第二课: 进击的指针,C语言的王牌 3.第二部分第三课预告: 数组 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言 ...

  3. 对比Windows 8模拟器(Simulator)和Windows Phone仿真器(Emulator)

    原文:对比Windows 8模拟器(Simulator)和Windows Phone仿真器(Emulator) 从事移动应用开发,经常会用到模拟器(Simulator)和仿真器(Emulator),本 ...

  4. 【Android进阶】Activity和Fragement中onSaveInstanceState()的使用详解

    在activity(或者是fragement)被杀掉之前调用保存每个实例的状态,以保证该状态可以在onCreate(Bundle)或者onRestoreInstanceState(Bundle) (传 ...

  5. 百度云盘建svnserver步骤

    安装tortoisesvn(略) 安装visualsvn(主server您可以使用)(略步骤)例如下面的安装文件夹后,: 注冊百度账号.进入百度云盘页面,建立目录,如mysvn. 下载百度云盘clie ...

  6. [原创].NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇)

    原文:[原创].NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇) .NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇) 前言:上一篇文章讲述了一些实现DAL的理论,本 ...

  7. poj 3013 Big Christmas Tree (dij+优先级队列优化 求最短)

    模板 意甲冠军:给你一个图,1始终根,每一方都有单价值,每个点都有权重新. 每个边缘的价格值 = sum(后继结点重)*单价方值. 最低价格要求树值,它构成了一棵树n-1条边的最小价值. 算法: 1. ...

  8. nyist 488 素数环(搜索+回溯)

     素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 有一个整数n,把从1到n的数字无反复的排列成环,且使每相邻两个数(包含首尾)的和都为素数,称为素数环. ...

  9. MVC常用特性

    MVC常用特性使用   简介 在以前的文章中,我和大家讨论如何用SingalR和数据库通知来完成一个消息监控应用. 在上一篇文章中,我介绍了如何在MVC中对MongoDB进行CRUD操作. 今天,我将 ...

  10. C语言easy忽视的细节(第四部分)

    前言:本文的目的是记录C这些语言easy忽视的细节.我会每天花一点时间来阅读整理,坚持下去,今天是第一章.也许今天是下个月的第二,明年,今天是第几?--我坚信,,记性不如烂笔头.第四篇了.fight~ ...