1、源码

CircleArrayQueue

  1. package com.study.queue;
  2. //使用数组模拟一个队列
  3. public class CircleArrayQueue {
  4. private int maxSize;//表示数组的最大容量
  5. private int front;//队列头,初始值为0
  6. private int rear;//队列尾,初始值为0
  7. private int[] arr;//该数组用于存放数据,模拟队列
  8. //创建队列构造器
  9. public CircleArrayQueue(int arrMaxSize) {
  10. maxSize = arrMaxSize;
  11. arr = new int[maxSize];
  12. }
  13. //判断队列是否满
  14. public boolean isFull() {
  15. return (rear+1)%maxSize==front;
  16. }
  17. //判断队列是否空
  18. public boolean isEmpty() {
  19. return front == rear;
  20. }
  21. //添加数据到队列
  22. public void addQueue(int n) {
  23. if (isFull()) {
  24. System.out.println("队列满,不能加数据");
  25. return;
  26. }
  27. arr[rear] = n;
  28. rear = (rear+1)%maxSize;
  29. }
  30. //获取队列的数据
  31. public int getQueue() {
  32. if (isEmpty()) {
  33. throw new RuntimeException("队列空,不能去数据");
  34. }
  35. int value= arr[front];
  36. front = (front+1)%maxSize;
  37. return value;
  38. }
  39. //显示队列所有数据
  40. public void show() {
  41. if (isEmpty()) {
  42. System.out.println("队列空,没有数据");
  43. return;
  44. }
  45. for (int i = front; i < front + size(); i++) {
  46. System.out.println(arr[i%maxSize]);
  47. }
  48. }
  49. //求出当前数组有效数据的个数
  50. public int size(){
  51. return (rear+maxSize-front)%maxSize;
  52. }
  53. //显示队列的头数据
  54. public int headQueue() {
  55. if (isEmpty()) {
  56. throw new RuntimeException("队列空,没有数据");
  57. }
  58. return arr[front];
  59. }
  60. }

CircleArrayQueueDemo

  1. package com.study.queue;
  2. import java.util.Scanner;
  3. public class CircleArrayQueueDemo {
  4. public static void main(String[] args) {
  5. CircleArrayQueue queue = new CircleArrayQueue(4);
  6. String key = null;
  7. Scanner scanner = new Scanner(System.in);
  8. boolean loop = true;
  9. System.out.println("s(show),显示队列");
  10. System.out.println("e(exit),退出程序");
  11. System.out.println("a(add),添加数据到队列");
  12. System.out.println("g(get),从队列中获取数据");
  13. System.out.println("h(head),显示队列头的数据");
  14. while (loop) {
  15. key = scanner.nextLine();
  16. switch (key) {
  17. case "s":
  18. queue.show();
  19. break;
  20. case "a":
  21. System.out.println("输入一个数");
  22. int value = scanner.nextInt();
  23. queue.addQueue(value);
  24. break;
  25. case "g":
  26. try {
  27. int res = queue.getQueue();
  28. System.out.println("取出的数据是" + res);
  29. } catch (Exception e) {
  30. System.out.println(e.getMessage());
  31. }
  32. break;
  33. case "h":
  34. try {
  35. int res = queue.headQueue();
  36. System.out.println("队列头的数据是" + res);
  37. } catch (Exception e) {
  38. System.out.println(e.getMessage());
  39. }
  40. break;
  41. case "e":
  42. scanner.close();
  43. loop = false;
  44. break;
  45. default:
  46. break;
  47. }
  48. }
  49. System.out.println("程序退出");
  50. }
  51. }

2、运行结果

图片.png

图片.png

通过环形队列,可以解决数组只能使用一次的问题

3、总结

尾索引的下一个为头索引时表示队列满,即将队 列容量空出一个作为约定,这个在做判断队列满的 时候需要注意 (rear + 1) % maxSize == front [满]
rear == front [空]