1. package com.atguigu.queue;
    2. import java.util.Scanner;
    3. /**
    4. * demo 演示
    5. * 队列的演示
    6. *
    7. * @author Dxkstart
    8. * @create 2021-09-27-19:18
    9. */
    10. public class ArrayQueueDemo {
    11. public static void main(String[] args) {
    12. Scanner scanner = new Scanner(System.in);
    13. //测试队列
    14. //创建一个队列
    15. ArrayQueue arrayQueue = new ArrayQueue(5);
    16. boolean b = true;
    17. while (b) {
    18. System.out.println("请选择功能:");
    19. System.out.println("1.显示队列");
    20. System.out.println("2.添加数据到队列");
    21. System.out.println("3.从队列取出数据");
    22. System.out.println("4.查看队列头的数据");
    23. System.out.println("5.退出程序");
    24. int key = scanner.nextInt();//用户输入数字选择功能
    25. switch (key) {
    26. case (1):
    27. arrayQueue.showQueue();
    28. System.out.println();
    29. break;
    30. case (2):
    31. System.out.println("请输入一个数字");
    32. int value = scanner.nextInt();//用户输入队列的数据
    33. arrayQueue.addQueue(value);
    34. System.out.println();
    35. break;
    36. case (3):
    37. try {
    38. System.out.println("取出的数据是:" + arrayQueue.getQueue());
    39. } catch (Exception e) {
    40. System.out.println(e.getMessage());
    41. }
    42. System.out.println();
    43. break;
    44. case (4):
    45. try {
    46. System.out.println("队列头数据为:" + arrayQueue.headQueue());
    47. } catch (Exception e) {
    48. System.out.println(e.getMessage());
    49. }
    50. System.out.println();
    51. break;
    52. case (5):
    53. b = false;
    54. break;
    55. default:
    56. break;
    57. }
    58. }
    59. System.out.println("程序退出!");
    60. }
    61. }
    62. //使用数组模拟队列 - 编写一个ArrayQueue类
    63. class ArrayQueue {
    64. private int maxSize;//表示数组的最大容量
    65. private int front;//队列头
    66. private int rear;//队列尾
    67. private int[] arr;//该数组用于存放数据,模拟队列
    68. //创建队列的构造器
    69. //初始化设定这个队列
    70. public ArrayQueue(int arrMaxSize) {
    71. maxSize = arrMaxSize;
    72. arr = new int[maxSize];
    73. front = -1;//指向队列头部,分析出front是指向队列头的前一个位置
    74. rear = -1;//指向队列尾部,指向队列尾的数据
    75. }
    76. //判断队列是否已满
    77. public boolean isFull() {
    78. return rear == maxSize - 1;
    79. }
    80. //判断队列是否为空
    81. public boolean isEmpty() {
    82. return rear == front;
    83. }
    84. //添加数据到队列
    85. public void addQueue(int n) {
    86. //先判断队列是否已满
    87. if (isFull()) {
    88. System.out.println("队列已满,不能再添加啦!");
    89. return;
    90. }
    91. rear++;//让rear后移,队尾指针后移
    92. arr[rear] = n;
    93. System.out.println("添加成功!");
    94. }
    95. //获取出队列的数据,出队列,先进先出
    96. public int getQueue() {
    97. //先判断队列是否为空
    98. if (isEmpty()) {
    99. //通过抛出异常来处理
    100. throw new RuntimeException("队列为空呢!");
    101. }
    102. front++;//因为front指向的是队列头的前一个位置 !!!
    103. return arr[front];
    104. }
    105. //显示队列的所有数据
    106. public void showQueue() {
    107. //遍历
    108. if (isEmpty()) {
    109. System.out.println("队列为空,不能遍历");
    110. return;
    111. }
    112. for (int i = 0; i < maxSize; i++) {
    113. System.out.println("(" + i + "): " + arr[i]);
    114. }
    115. }
    116. //显示队列的头数据,注意不是取出数据
    117. public int headQueue() {
    118. if (isEmpty()) {
    119. throw new RuntimeException("队列为空,没有数据");
    120. }
    121. return arr[front + 1];
    122. }
    123. }