数据结构与算法-队列

Bertha 。 2024-03-31 11:31 227阅读 0赞

什么是队列
队列是一种特殊的线性表,说特殊是因为它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。例如我们去商店收银排队结账一样,就是一个队列,是一种FIFO先入先出的数据结构。

算法原理
1、初始化定长队列
2、插入元素需要先判断队列是否已经达到上限,达到上限进行扩容,否则进行队尾指针增加并插入元素
3、移除元素需要判断队列是否已经为空,为空抛出异常,否则将队首置空并重新规划队列

小试牛刀
1、创建队列模拟类,并提供入队、出队方法

  1. /**
  2. * 队列
  3. * @author senfel
  4. * @version 1.0
  5. * @date 2022/11/25 16:07
  6. */
  7. @Slf4j
  8. public class Queue {
  9. /**
  10. * 队列数组
  11. */
  12. private Object[] elementList;
  13. /**
  14. * 队头
  15. */
  16. private int head;
  17. /**
  18. * 队尾
  19. */
  20. private int tail;
  21. /**
  22. * 队列长度
  23. */
  24. private int capacity;
  25. public Queue(int capacity) {
  26. this.capacity = capacity;
  27. this.elementList = new Object[capacity];
  28. this.head = 0;
  29. this.tail = -1;
  30. }
  31. /**
  32. * 元素个数
  33. * @return
  34. */
  35. public int size(){
  36. return tail-head+1;
  37. }
  38. /**
  39. * 队列是否为空
  40. * @return
  41. */
  42. public Boolean isEmpty(){
  43. return tail == -1;
  44. }
  45. /**
  46. * 队列长度
  47. * @return
  48. */
  49. public int queueLength(){
  50. return elementList.length;
  51. }
  52. /**
  53. * 入队
  54. * @param element
  55. * @author senfel
  56. * @date 2022/11/25 16:26
  57. * @return void
  58. */
  59. public void add(Object element){
  60. //队列满了扩容至两倍大小
  61. if(tail+1 >= elementList.length){
  62. log.error("队列达到最大容量:{}",capacity);
  63. int length = 0;
  64. if(elementList.length << 1 > Integer.MAX_VALUE){
  65. length = Integer.MAX_VALUE;
  66. }else{
  67. length = elementList.length << 1;
  68. }
  69. capacity = length;
  70. log.error("队列达到最大容量扩容至:{}",capacity);
  71. elementList = Arrays.copyOf(elementList,length);
  72. }
  73. //尾部索引增加并赋值
  74. elementList[++tail] = element;
  75. log.error("入队元素:{}",elementList[tail]);
  76. log.error("当前队列详情:{}",Arrays.toString(elementList));
  77. log.error("当前队列元素个数:{}",size());
  78. }
  79. /**
  80. * 出队
  81. * @author senfel
  82. * @date 2022/11/25 16:36
  83. * @return void
  84. */
  85. public void remove(){
  86. if(isEmpty()){
  87. throw new RuntimeException("队列为空");
  88. }
  89. log.error("出队元素:{}",elementList[head]);
  90. elementList[head] = null;
  91. //队列重排
  92. Object[] newQueue = new Object[capacity];
  93. System.arraycopy(elementList,head+1,newQueue,0,size());
  94. elementList = newQueue;
  95. tail--;
  96. log.error("当前队列详情:{}",Arrays.toString(elementList));
  97. log.error("当前队列元素个数:{}",size());
  98. }
  99. }

2、提供测试方法

  1. public static void main(String[] args) {
  2. Queue queue = new Queue(5);
  3. for(int i = 0;i<7;i++){
  4. queue.add(i);
  5. }
  6. log.error("队列长度为:{}",queue.queueLength());
  7. //模拟出队
  8. queue.remove();
  9. queue.remove();
  10. log.error("队列长度为:{}",queue.queueLength());
  11. }

3、加粗样式查看测试结果并展示出入队详情

17:01:13.028 - 入队元素:0
17:01:13.031 - 当前队列详情:[0, null, null, null, null]
17:01:13.031 - 当前队列元素个数:1
17:01:13.031 - 入队元素:1
17:01:13.031 - 当前队列详情:[0, 1, null, null, null]
17:01:13.031 - 当前队列元素个数:2
17:01:13.031 - 入队元素:2
17:01:13.031 - 当前队列详情:[0, 1, 2, null, null]
17:01:13.031 - 当前队列元素个数:3
17:01:13.031 - 入队元素:3
17:01:13.031 - 当前队列详情:[0, 1, 2, 3, null]
17:01:13.031 - 当前队列元素个数:4
17:01:13.031 - 入队元素:4
17:01:13.031 - 当前队列详情:[0, 1, 2, 3, 4]
17:01:13.031 - 当前队列元素个数:5
17:01:13.031 - 队列达到最大容量:5
17:01:13.031 - 队列达到最大容量扩容至:10
17:01:13.031 - 入队元素:5
17:01:13.031 - 当前队列详情:[0, 1, 2, 3, 4, 5, null, null, null, null]
17:01:13.031 - 当前队列元素个数:6
17:01:13.031 - 入队元素:6
17:01:13.031 - 当前队列详情:[0, 1, 2, 3, 4, 5, 6, null, null, null]
17:01:13.031 - 当前队列元素个数:7
17:01:13.031 - 队列长度为:10

17:01:13.031 - 出队元素:0
17:01:13.031 - 当前队列详情:[1, 2, 3, 4, 5, 6, null, null, null, null]
17:01:13.031 - 当前队列元素个数:6
17:01:13.031 - 出队元素:1
17:01:13.031 - 当前队列详情:[2, 3, 4, 5, 6, null, null, null, null, null]
17:01:13.031 - 当前队列元素个数:5
17:01:13.031 - 队列长度为:10

发表评论

表情:
评论列表 (有 0 条评论,227人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数据结构算法-队列

    什么是队列 队列是一种特殊的线性表,说特殊是因为它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。

    相关 数据结构算法队列

    基本介绍 队列是一个有序列表,可以使用数组或链表来实现。 队列遵循先进先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出。 数组模拟队列 因为队列的输

    相关 数据结构算法队列

    前言 队列是一个有序的线性列表,可以用数组或链表来实现,遵循先进先出、后进后出的原则。 队列只能从列表的一端进行入队另一端进行出队操作。 队列有两种存储数据的形式: