* 注: 本文/本系列谢绝转载,如有转载,本人有权利追究相应责任。 2019年4月8日

Stan Zhang 2019年4月8日  格物致知,经世致用。

队列是一种先进先出FIFO的模型,常见操作有: push、pull 获得队列出口首元素并从队列中删除、peek 查看队列出口首元素,不从队列中删除。

队列与其他线性结构一样,可以使用数组或者链表实现,这里使用数组实现。

使用数组实现队列长度必然是固定的,因此规定当队列存满之后不再进行扩容,只是提示。

队列中为了充分使用数据空间,首尾指针采用与数组长度求模的方式进行添加和删除。

Java代码:

  1. package ds2.queue;
  2.  
  3. public class ArrayQueue {
  4. static class Queue{
  5. int maxSize;
  6. int queSize;
  7. long[] data ;
  8. int head; // 头索引
  9. int tail; // 尾索引
  10. public Queue(int maxSize) {
  11. this.maxSize = maxSize;
  12. this.data = new long[maxSize];
  13. this.head = 0;
  14. this.tail = -1;
  15. }
  16.  
  17. public boolean isFull(){
  18. return maxSize == queSize;
  19. }
  20.  
  21. public boolean isEmpty(){
  22. return queSize == 0;
  23. }
  24.  
  25. /**
  26. * 向尾部加数据
  27. * 线性时间
  28. * @param data
  29. */
  30. public void push(long data){
  31. if(isFull()){
  32. System.out.println("The element cann't be inserted owing to the queue is full!");
  33. }else{
  34. this.tail = (this.tail + 1)%this.data.length;
  35. this.data[this.tail] = data;
  36. this.queSize ++ ;
  37. }
  38. }
  39.  
  40. /**
  41. * 从头部取数据,线性时间
  42. * @return
  43. */
  44. public long peek(){
  45. return this.data[this.head];
  46. }
  47.  
  48. /**
  49. * 从头部取数据
  50. * @return
  51. */
  52. public long pull(){
  53. long data = this.data[this.head];
  54. this.head = (this.head + 1)%this.data.length;
  55. this.queSize --;
  56. return data;
  57. }
  58.  
  59. public void foreachPrint(){
  60. if(this.isEmpty()){
  61. System.out.println("[]");
  62. return;
  63. }
  64. System.out.print("[" + this.data[this.head]);
  65. for(int i = 1,j = this.head + 1; i < queSize; i++,j++){
  66. System.out.print("," + this.data[j%this.data.length]);
  67. }
  68. System.out.println("]");
  69. }
  70.  
  71. }
  72.  
  73. public static void main(String[] args) {
  74. Queue queue = new Queue(4);
  75. queue.push(1);
  76. queue.foreachPrint();
  77. queue.push(2);
  78. queue.foreachPrint();
  79. queue.push(3);
  80. queue.foreachPrint();
  81. queue.push(4);
  82. queue.foreachPrint();
  83. queue.push(5);
  84. queue.foreachPrint();
  85. System.out.println(queue.peek());
  86. queue.foreachPrint();
  87. System.out.println(queue.pull());
  88. queue.foreachPrint();
  89. System.out.println(queue.pull());
  90. queue.foreachPrint();
  91. queue.push(5);
  92. queue.foreachPrint();
  93. queue.push(6);
  94. queue.foreachPrint();
  95. }
  96. }

result::

  1. [1]
  2. [1,2]
  3. [1,2,3]
  4. [1,2,3,4]
  5. The element cann't be inserted owing to the queue is full!
  6. [1,2,3,4]
  7. 1
  8. [1,2,3,4]
  9. 1
  10. [2,3,4]
  11. 2
  12. [3,4]
  13. [3,4,5]
  14. [3,4,5,6]

[数据结构]P1.2 队列的更多相关文章

  1. C语言数据结构-链式队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作

    1.数据结构-链式队列的实现-C语言 typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef st ...

  2. javascript数据结构与算法---队列

    javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...

  3. C++数据结构之链式队列(Linked Queue)

    C++数据结构之链式队列,实现的基本思想和链式栈的实现差不多,比较不同的一点也是需要注意的一点是,链式队列的指向指针有两个,一个是队头指针(front),一个是队尾指针(rear),注意指针的指向是从 ...

  4. [数据结构]C语言队列的实现

    我个人把链表.队列.栈分为一类,然后图.树分为一类.(串不考虑),分类的理由就是每一类有规律可循,即你能通过修改极少数的代码把链表变成队列.栈.(这里我们不考虑其他诸如设计模式等因素),因此本贴在讲完 ...

  5. JavaScript数据结构和算法----队列

    前言 队列和栈很像,只是用了不同的原则.队列是遵循先进先出(FIFO)原则的一组有序的的项,队列在尾部添加新元素,从顶部移除元素.最新添加的元素必须必须排队在队列的,末尾.可以想象食堂排队买饭的样子. ...

  6. JavaScript数据结构与算法-队列练习

    队列的实现 // 队列类 function Deque () { this.dataStore = []; this.enqueueFront = enqueueFront; this.enqueue ...

  7. 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列

    栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...

  8. C语言- 基础数据结构和算法 - 队列的顺序存储

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  9. python数据结构与算法——队列

    队列结构可以使用数组来模拟,只需要设定头和尾的两个标记 参考自<啊哈> # 按书中的代码会出现索引越界的问题(书中申请了超量的空间) # 尝试令tai初始为len(q)-1则不会出错但少了 ...

随机推荐

  1. Web开发——jQuery基础

    参考: 参考W3School:jQuery 教程 参考:jQuery 参考手册 参考(常用):jQuery API 测试 JavaScript 框架库 - jQuery 测试 JavaScript 框 ...

  2. Hibernate 补充 ManyToOne、OneToMany、OneToOne的使用例

    1.前言      Hibernate 为程序员提供一种级联操作,在编写程序时,通过 Hibernate 的级联功能可以很方便的操作数据库的主从表的数据, 我们最常用的级联是级联保存和级联删除.   ...

  3. Mac 报错:-bash: telnet: command not found

    解决方法 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/i ...

  4. java框架之Spring(3)-JDBC模板使用&事务管理

    下面内容使用到的 jar 包下载 JDBC模板使用 入门 1.导包,如要导入 Spring 的基本开发包.数据库驱动包.Spring 提供的 JDBC 模板包,如下: 2.测试: @Test publ ...

  5. #WEB安全基础 : HTTP协议 | 0x1 TCP/IP通信

    TCP/IP是如何通信的呢? 请看图 用TCP/IP协议族通信时,会通过分层顺序与对方进行通信.发送端从应用层往下走,接受层从链路层往上走. 客户端为了浏览界面在应用层发送请求,为了方便传输在传输层的 ...

  6. sql 身份证计算年龄和性别

    IdentityNumber 是身份证号 年龄: ,), GETDATE()) / 365.25) as '推荐人年龄', 15位的身份证计算年龄: case when b.IdentityNumbe ...

  7. Kubernetes持久化存储1——示例

    目录贴:Kubernetes学习系列 一.简介 存储管理与计算管理是两个不同的问题.Persistent Volume子系统,对存储的供应和使用做了抽象,以API形式提供给管理员和用户使用.要完成这一 ...

  8. Python工资高还是Java?

    说起来,随着人工智能和大数据逐渐进入人们的眼中,越来越多的人看到互联网未来大好发展趋势,而想要学习一门技术来进入其中,以期分一杯羹.但是,作为人工智能和大数据的重要编程语言,Python和Java,该 ...

  9. koa2 中 cookie 存在的中文问题

    koa2  中的 cookie 没办法直接设置中文,会报错 ‘ argument value is invalid ’ 解决办法: 先将它转成 ‘ base64 ’ 编码来存储 new Buffer( ...

  10. ts文件编译后变量在vscode里报错

    需要将编译过的同名js文件删除才可以