队列:

先进先出,处理类似排队的问题,先排的。先处理,后排的等前面的处理完了,再处理

对于插入和移除操作的时间复杂度都为O(1)。从后面插入,从前面移除

双端队列:

即在队列两端都能够insert和remove:insertLeft、insertRight。removeLeft、removeRight

含有栈和队列的功能,如去掉insertLeft、removeLeft,那就跟栈一样了。如去掉insertLeft、removeRight。那就跟队列一样了

一般使用频率较低,时间复杂度 O(1)

优先级队列:

内部维护一个按优先级排序的序列。插入时须要比較查找插入的位置,时间复杂度O(N), 删除O(1)

  1. /*
  2. * 队列 先进先出。一个指针指示插入的位置,一个指针指示取出数据项的位置
  3. */
  4. public class QueueQ<T> {
  5. private int max;
  6. private T[] ary;
  7. private int front; //队头指针 指示取出数据项的位置
  8. private int rear; //队尾指针 指示插入的位置
  9. private int nItems; //实际数据项个数
  10.  
  11. public QueueQ(int size) {
  12. this.max = size;
  13. ary = (T[]) new Object[max];
  14. front = 0;
  15. rear = -1;
  16. nItems = 0;
  17. }
  18. //插入队尾
  19. public void insert(T t) {
  20. if (rear == max - 1) {//已到实际队尾,从头開始
  21. rear = -1;
  22. }
  23. ary[++rear] = t;
  24. nItems++;
  25. }
  26. //移除队头
  27. public T remove() {
  28. T temp = ary[front++];
  29. if (front == max) {//列队到尾了,从头開始
  30. front = 0;
  31. }
  32. nItems--;
  33. return temp;
  34. }
  35. //查看队头
  36. public T peek() {
  37. return ary[front];
  38. }
  39.  
  40. public boolean isEmpty() {
  41. return nItems == 0;
  42. }
  43.  
  44. public boolean isFull() {
  45. return nItems == max;
  46. }
  47.  
  48. public int size() {
  49. return nItems;
  50. }
  51.  
  52. public static void main(String[] args) {
  53. QueueQ<Integer> queue = new QueueQ<Integer>(3);
  54. for (int i = 0; i < 5; i++) {
  55. queue.insert(i);
  56. System.out.println("size:" + queue.size());
  57. }
  58. for (int i = 0; i < 5; i++) {
  59. Integer peek = queue.peek();
  60. System.out.println("peek:" + peek);
  61. System.out.println("size:" + queue.size());
  62. }
  63. for (int i = 0; i < 5; i++) {
  64. Integer remove = queue.remove();
  65. System.out.println("remove:" + remove);
  66. System.out.println("size:" + queue.size());
  67. }
  68.  
  69. System.out.println("----");
  70.  
  71. for (int i = 5; i > 0; i--) {
  72. queue.insert(i);
  73. System.out.println("size:" + queue.size());
  74. }
  75. for (int i = 5; i > 0; i--) {
  76. Integer peek = queue.peek();
  77. System.out.println("peek:" + peek);
  78. System.out.println("size:" + queue.size());
  79. }
  80. for (int i = 5; i > 0; i--) {
  81. Integer remove = queue.remove();
  82. System.out.println("remove:" + remove);
  83. System.out.println("size:" + queue.size());
  84. }
  85. }
  86.  
  87. }
  1. /*
  2. * 双端队列<span style="white-space:pre"> </span>两端插入、删除
  3. */
  4. public class QueueQT<T> {
  5. private LinkedList<T> list;
  6.  
  7. public QueueQT() {
  8. list = new LinkedList<T>();
  9. }
  10.  
  11. // 插入队头
  12. public void insertLeft(T t) {
  13. list.addFirst(t);
  14. }
  15.  
  16. // 插入队尾
  17. public void insertRight(T t) {
  18. list.addLast(t);
  19. }
  20.  
  21. // 移除队头
  22. public T removeLeft() {
  23. return list.removeFirst();
  24. }
  25.  
  26. // 移除队尾
  27. public T removeRight() {
  28. return list.removeLast();
  29. }
  30.  
  31. // 查看队头
  32. public T peekLeft() {
  33. return list.getFirst();
  34. }
  35.  
  36. // 查看队尾
  37. public T peekRight() {
  38. return list.getLast();
  39. }
  40.  
  41. public boolean isEmpty() {
  42. return list.isEmpty();
  43. }
  44.  
  45. public int size() {
  46. return list.size();
  47. }
  48.  
  49. }
  1. /*
  2. * 优先级队列 队列中按优先级排序。是一个有序的队列
  3. */
  4. public class QueueQP {
  5. private int max;
  6. private int[] ary;
  7. private int nItems; //实际数据项个数
  8.  
  9. public QueueQP(int size) {
  10. this.max = size;
  11. ary = new int[max];
  12. nItems = 0;
  13. }
  14. //插入队尾
  15. public void insert(int t) {
  16. int j;
  17. if (nItems == 0) {
  18. ary[nItems++] = t;
  19. } else {
  20. for (j = nItems - 1; j >= 0; j--) {
  21. if (t > ary[j]) {
  22. ary[j + 1] = ary[j]; //前一个赋给后一个 小的在后 相当于用了插入排序。给定序列本来就是有序的。所以效率O(N)
  23. } else {
  24. break;
  25. }
  26. }
  27. ary[j + 1] = t;
  28. nItems++;
  29. }
  30. System.out.println(Arrays.toString(ary));
  31. }
  32. //移除队头
  33. public int remove() {
  34. return ary[--nItems]; //移除优先级小的
  35. }
  36. //查看队尾 优先级最低的
  37. public int peekMin() {
  38. return ary[nItems - 1];
  39. }
  40.  
  41. public boolean isEmpty() {
  42. return nItems == 0;
  43. }
  44.  
  45. public boolean isFull() {
  46. return nItems == max;
  47. }
  48.  
  49. public int size() {
  50. return nItems;
  51. }
  52.  
  53. public static void main(String[] args) {
  54. QueueQP queue = new QueueQP(3);
  55. queue.insert(1);
  56. queue.insert(2);
  57. queue.insert(3);
  58. int remove = queue.remove();
  59. System.out.println("remove:" + remove);
  60.  
  61. }
  62.  
  63. }

Java 模拟队列(一般队列、双端队列、优先级队列)的更多相关文章

  1. 自己动手实现java数据结构(四)双端队列

    1.双端队列介绍 在介绍双端队列之前,我们需要先介绍队列的概念.和栈相对应,在许多算法设计中,需要一种"先进先出(First Input First Output)"的数据结构,因 ...

  2. Java数据结构——用双端链表实现队列

    //================================================= // File Name : LinkQueue_demo //---------------- ...

  3. JAVA基础——链表结构之双端链表

    双端链表:双端链表与传统链表非常相似.只是新增了一个属性-即对最后一个链结点的引用 如上图所示:由于有着对最后一个链结点的直接引用.所以双端链表比传统链表在某些方面要方便.比如在尾部插入一个链结点.双 ...

  4. 队列(存储结构双端链表)--Java实现

    /*用链表实现的队列--使用的是双端链表 *注意:空指针错误肯定是引用没有指向对象 * */ public class MyLinkedQueue { private MyFirstAndLastLi ...

  5. [转载]队列queue和双端Dequeue

    转载自:http://uule.iteye.com/blog/2095650?utm_source=tuicool 注意:这都只是接口而已 1.Queue API 在java5中新增加了java.ut ...

  6. 队列Queue、栈LifoQueue、优先级队列PriorityQueue

    队列:队列是先进先出. import queue q = queue.Queue() q.put(1) q.put(2) q.put(3) q.put(4) print(q.get()) print( ...

  7. java数据结构——单链表、双端链表、双向链表(Linked List)

    1.继续学习单链表,终于摆脱数组的魔爪了,单链表分为数据域(前突)和引用域(指针域)(后继),还有一个头结点(就好比一辆火车,我们只关心火车头,不关心其它车厢,只需知晓车头顺藤摸瓜即可),头结点没有前 ...

  8. 并发编程-concurrent指南-阻塞双端队列-链阻塞双端队列LinkedBlockingDeque

    LinkedBlockingDeque是双向链表实现的阻塞队列.该阻塞队列同时支持FIFO和FILO两种操作方式,即可以从队列的头和尾同时操作(插入/删除): 在不能够插入元素时,它将阻塞住试图插入元 ...

  9. Java实现 LeetCode 641 设计循环双端队列(暴力)

    641. 设计循环双端队列 设计实现双端队列. 你的实现需要支持以下操作: MyCircularDeque(k):构造函数,双端队列的大小为k. insertFront():将一个元素添加到双端队列头 ...

  10. Fork/Join框架之双端队列

    简介 ForkJoinPool管理着ForkJoinWorkerThread线程,ForkJoinWorkerThread线程内部有一个双端队列,这个双端队列主要由一个数组queue.数组下标queu ...

随机推荐

  1. linux下编译qt5.6.0静态库——configure配置(超详细,有每一个模块的说明)(乌合之众)

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  2. 基于visual Studio2013解决面试题之0807strstr函数

     题目

  3. .Net 4.0特性 Tuple元组

    Tuple 字面意思:元组.是.net4.0增加的新特性,是干什么的呢?总结一句,个人觉得这个东西 就是用来在有返回很多种类型的值时可以用到.它提供了8种类型的Tuple,直接看最复杂的那种(其实不是 ...

  4. 显示出eclipse文件层次

    看到图片中右边那个倒三角型符号没, 点一下,弹出个菜单,选package presentation->hierarachial 文件目录结构 flat 是包结构

  5. UVA 839 (13.08.20)

     Not so Mobile  Before being an ubiquous communications gadget, a mobile wasjust a structure made of ...

  6. hadoop深入研究:(五)——Archives

    转载请注明来源地址:http://blog.csdn.net/lastsweetop/article/details/9123155 简介 我们在hadoop深入研究:(一)——hdfs介绍里已讲过, ...

  7. FOJ 1607 Greedy division 数学题

    题目地址: http://acm.fzu.edu.cn/problem.php?pid=1607 给定一个n,将n平均分成m份,问有几种方法,每种方法中找出最大的数.思路:就是求n的因子数.先将每个数 ...

  8. 使用malloc分别分配2KB,6KB的内存空间,打印指针地址

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> i ...

  9. MFC 单文档中动态添加菜单项和响应菜单事件

    新建一个单文档程序 在查看菜单项中增加两个子菜单,分别为隐藏工具栏(ID_HIDE),新建菜单(ID_NEWMENU) 在Resource.h中增加一个ID_NEWMENU宏 #define ID_N ...

  10. WAS ND集群中的HTTP内存会话复制对Java应用程序序列化编程的要求

    应用程序需要遵守的约定 在会话中没有自定义对象时,WAS 集群的 HTTP 会话内存复制特性成功地实现了高可用性,使用户在宕机过程中的会话信息没有丢失,操作没有受到任何影响. 在会话中包含自定义对象时 ...