zcq

    1. package com.atguigu.queue;
    2. import java.util.Scanner;
    3. public class ArrayQueueDemo {
    4. public static void main(String[] args) {
    5. //测试一把
    6. //创建一个队列
    7. ArrayQueue queue = new ArrayQueue(3);
    8. char key = ' '; //接收用户输入
    9. Scanner scanner = new Scanner(System.in);//
    10. boolean loop = true;
    11. //输出一个菜单
    12. while(loop) {
    13. System.out.println("s(show): 显示队列");
    14. System.out.println("e(exit): 退出程序");
    15. System.out.println("a(add): 添加数据到队列");
    16. System.out.println("g(get): 从队列取出数据");
    17. System.out.println("h(head): 查看队列头的数据");
    18. key = scanner.next().charAt(0);//接收一个字符
    19. switch (key) {
    20. case 's':
    21. queue.showQueue();
    22. break;
    23. case 'a':
    24. System.out.println("输出一个数");
    25. int value = scanner.nextInt();
    26. queue.addQueue(value);
    27. break;
    28. case 'g': //取出数据
    29. try {
    30. int res = queue.getQueue();
    31. System.out.printf("取出的数据是%d\n", res);
    32. } catch (Exception e) {
    33. // TODO: handle exception
    34. System.out.println(e.getMessage());
    35. }
    36. break;
    37. case 'h': //查看队列头的数据
    38. try {
    39. int res = queue.headQueue();
    40. System.out.printf("队列头的数据是%d\n", res);
    41. } catch (Exception e) {
    42. // TODO: handle exception
    43. System.out.println(e.getMessage());
    44. }
    45. break;
    46. case 'e': //退出
    47. scanner.close();
    48. loop = false;
    49. break;
    50. default:
    51. break;
    52. }
    53. }
    54. System.out.println("程序退出~~");
    55. }
    56. }
    57. // 使用数组模拟队列-编写一个ArrayQueue类
    58. class ArrayQueue {
    59. private int maxSize; // 表示数组的最大容量
    60. private int front; // 队列头
    61. private int rear; // 队列尾
    62. private int[] arr; // 该数据用于存放数据, 模拟队列
    63. // 创建队列的构造器
    64. public ArrayQueue(int arrMaxSize) {
    65. maxSize = arrMaxSize;
    66. arr = new int[maxSize];
    67. front = -1; // 指向队列头部,分析出front是指向队列头的前一个位置.
    68. rear = -1; // 指向队列尾,指向队列尾的数据(即就是队列最后一个数据)
    69. }
    70. // 判断队列是否满
    71. public boolean isFull() {
    72. return rear == maxSize - 1;
    73. }
    74. // 判断队列是否为空
    75. public boolean isEmpty() {
    76. return rear == front;
    77. }
    78. // 添加数据到队列
    79. public void addQueue(int n) {
    80. // 判断队列是否满
    81. if (isFull()) {
    82. System.out.println("队列满,不能加入数据~");
    83. return;
    84. }
    85. rear++; // 让rear 后移
    86. arr[rear] = n;
    87. }
    88. // 获取队列的数据, 出队列
    89. public int getQueue() {
    90. // 判断队列是否空
    91. if (isEmpty()) {
    92. // 通过抛出异常
    93. throw new RuntimeException("队列空,不能取数据");
    94. }
    95. front++; // front后移
    96. return arr[front];
    97. }
    98. // 显示队列的所有数据
    99. public void showQueue() {
    100. // 遍历
    101. if (isEmpty()) {
    102. System.out.println("队列空的,没有数据~~");
    103. return;
    104. }
    105. for (int i = 0; i < arr.length; i++) {
    106. System.out.printf("arr[%d]=%d\n", i, arr[i]);
    107. }
    108. }
    109. // 显示队列的头数据, 注意不是取出数据
    110. public int headQueue() {
    111. // 判断
    112. if (isEmpty()) {
    113. throw new RuntimeException("队列空的,没有数据~~");
    114. }
    115. return arr[front + 1];
    116. }
    117. }