数据结构-循环队列的实现

秒速五厘米 2023-06-01 05:53 115阅读 0赞

github 地址:https://github.com/heng1234/data-structure

接口:

  1. package com.company.Queue;
  2. /**
  3. * Queue
  4. * 队列接口
  5. * @author heng
  6. **/
  7. public interface Queue<E>{
  8. /**
  9. * 存入队列中
  10. * @param e
  11. */
  12. void enqueue(E e);
  13. /**
  14. * 从队列中取出一个元素 出队
  15. * @return
  16. */
  17. E dequeue();
  18. /**
  19. * 拿到队首
  20. * @return
  21. */
  22. E getFront();
  23. /**
  24. * 大小
  25. * @return
  26. */
  27. int getSize();
  28. /**
  29. * 是否为空
  30. * @return
  31. */
  32. boolean isEmpty();
  33. }

实现类:

  1. package com.company.Queue;
  2. /**
  3. * LoopQueue
  4. * 循环队列的实现
  5. * 循环队列需要从底层写起 不再用Array类了
  6. * @author heng
  7. * @date 2019/10/2
  8. **/
  9. public class LoopQueue<E> implements Queue<E> {
  10. /**
  11. * 存储数组
  12. */
  13. private E[] data;
  14. /**
  15. * front指的是队首
  16. * tail指的是队列里的最后一个元素的下一个位置
  17. */
  18. private int front,tail;
  19. /**
  20. * 存在多少个元素
  21. */
  22. private int size;
  23. /**
  24. * 这里需要浪费一个空间 所以用户传入的大小需要+1
  25. * @param capacity
  26. */
  27. public LoopQueue(int capacity){
  28. data = (E[]) new Object[capacity+1];
  29. front = 0;
  30. tail = 0;
  31. size = 0;
  32. }
  33. public LoopQueue(){
  34. this(10);
  35. }
  36. /**
  37. * 返回数组大小
  38. * 因为浪费了一个所以需要-1
  39. * @return
  40. */
  41. public int getCapacity(){
  42. return data.length - 1;
  43. }
  44. /**
  45. * 入队
  46. * @param e
  47. */
  48. @Override
  49. public void enqueue(E e) {
  50. if ((tail + 1) % data.length == front){
  51. resize(getCapacity() * 2);
  52. }
  53. data[tail] = e;
  54. tail = (tail + 1) % data.length;
  55. size++;
  56. }
  57. /**
  58. * 扩容
  59. * @param newCapatity
  60. */
  61. private void resize(int newCapatity) {
  62. E[] newData = (E[]) new Object[newCapatity+1];
  63. for (int i = 0; i < size; i++) {
  64. newData[i] = data[(i+front) % data.length];
  65. }
  66. data = newData;
  67. front = 0;
  68. tail = size;
  69. }
  70. /**
  71. * 出队
  72. * @return
  73. */
  74. @Override
  75. public E dequeue() {
  76. if(isEmpty()){
  77. throw new IllegalArgumentException("Cannot dequeue from an empty.");
  78. }
  79. E ret = data[front];
  80. data[front] = null;
  81. front = (front + 1) % data.length;
  82. size --;
  83. /**
  84. * 缩容
  85. */
  86. if (size == getCapacity() / 4 && getCapacity() / 2 != 0){
  87. resize(getCapacity() / 2);
  88. }
  89. return ret;
  90. }
  91. /**
  92. * 拿到队首
  93. * @return
  94. */
  95. @Override
  96. public E getFront() {
  97. if(isEmpty()){
  98. throw new IllegalArgumentException("Queue is empty.");
  99. }
  100. return data[front];
  101. }
  102. @Override
  103. public int getSize() {
  104. return size;
  105. }
  106. @Override
  107. public boolean isEmpty() {
  108. return front == tail;
  109. }
  110. @Override
  111. public String toString(){
  112. StringBuilder builder = new StringBuilder();
  113. builder.append(String.format("Queue: size = %d , capacaity = %d\n",size,getCapacity()));
  114. builder.append("front[ ");
  115. for (int i = front; i != tail; i=(i+1) % data.length) {
  116. builder.append(data[i]);
  117. if ((i+1)% data.length != tail){
  118. builder.append(" , ");
  119. }
  120. }
  121. builder.append(" ]tail");
  122. return builder.toString();
  123. }
  124. }

测试:

  1. public static void main(String[] args) {
  2. LoopQueue<Integer> queue = new LoopQueue<>();
  3. for (int i = 0; i < 12; i++) {
  4. queue.enqueue(i);
  5. System.out.println(queue);
  6. if (i == 5 || i == 7){
  7. queue.dequeue();
  8. System.out.println(queue);
  9. }
  10. }
  11. }

发表评论

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

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

相关阅读