普通数组模拟队列

思路:
定义数组容量maxSize;队列头 front; 队列尾:rear; 以及数组 arr[];
初始化front和rear都为-1;
以rear==maxSize-1来判断队列是否已满
以front==rear来判断队列是否为空
具体代码:

  1. package 算法.Queue;
  2. import java.util.Scanner;
  3. //用数组模拟队列
  4. public class ArrayQueueDemo {
  5. public static void main(String[] args) {
  6. ArrayQueue arrqueue=new ArrayQueue(3);
  7. Scanner input=new Scanner(System.in);
  8. String n;
  9. boolean loop=true;
  10. while (loop){
  11. System.out.println("s(show):显示所有数据");
  12. System.out.println("a(add):向队列中添加一个数据");
  13. System.out.println("g(get):取出队列头");
  14. System.out.println("h(head):查看队列头");
  15. System.out.println("e(exit):退出");
  16. n=input.next();
  17. switch (n){
  18. case "s":
  19. arrqueue.showQueue();
  20. break;
  21. case "a":
  22. System.out.println("请输入一个数");
  23. int value=input.nextInt();
  24. arrqueue.addQueue(value);
  25. break;
  26. case "g":
  27. try {
  28. int res=arrqueue.getQueue();
  29. System.out.println("取出的数据是:"+res);
  30. }catch (Exception e){
  31. System.out.println(e.getMessage());
  32. }
  33. break;
  34. case "h":
  35. try {
  36. int res=arrqueue.headQueue();
  37. System.out.println("队列的头数据为:"+res);
  38. }catch (Exception e){
  39. System.out.println(e.getMessage());
  40. }
  41. break;
  42. case "e":
  43. input.close();
  44. loop=false;
  45. break;
  46. default:
  47. break;
  48. }
  49. }
  50. System.out.println("程序退出");
  51. }
  52. }
  53. //用数组模拟队列
  54. class ArrayQueue{
  55. private int maxSize;//表示数组最大容量
  56. private int front;//队列头
  57. private int rear;//队列尾
  58. private int[] arr;//该数组用于存储数据,模拟队列
  59. public ArrayQueue(int maxSize) {
  60. this.maxSize = maxSize;
  61. this.arr=new int[maxSize];
  62. this.front = -1;
  63. this.rear = -1;
  64. }
  65. public boolean isEmpty(){//判断队列是否为空
  66. return front==rear;
  67. }
  68. public boolean isFull(){//判断队列是否已满
  69. return rear==maxSize-1;
  70. }
  71. public void addQueue(int value){//向队列中添加一个数据
  72. if(isFull()){
  73. System.out.println("队列已满");
  74. return;
  75. }
  76. arr[++rear]=value;
  77. }
  78. public int getQueue(){//取出队列头
  79. if(isEmpty()){
  80. throw new RuntimeException("队列为空,不能取数据");
  81. }
  82. return arr[++front];
  83. }
  84. public void showQueue(){//显示所有数据
  85. if(isEmpty()){
  86. System.out.println("队列为空,没有数据");
  87. return;
  88. }
  89. for (int i=0;i<arr.length;i++){
  90. System.out.println("arr["+i+"]="+arr[i]);
  91. }
  92. }
  93. public int headQueue(){//查看队列头
  94. if(isEmpty()){
  95. throw new RuntimeException("队列为空,不能无头数据");
  96. }
  97. return arr[front+1];
  98. }
  99. }

缺点:
此种方法有很多问题,数组只能利用一次
所以我们一般用循环数组来模拟队列

循环数组模拟队列

思路:
定义数组容量maxSize;队列头 front; 队列尾:rear; 以及数组 arr[];
初始化front和rear都为0;
以front==rear来判断队列是否为空

注意!以(rear+1)%maxSize==front来判断队列是否已满,因为是循环数组
且其数组存储数据的长度为 (rear+maxSize-front)%maxSize

因为需要用maxSize去做一个判断,且我的构造器是这个逻辑,
public CircleArrayQueue(int maxSize) {
this.maxSize = maxSize;
this.arr=new int[this.maxSize];
this.front = 0;
this.rear = 0;
}
所以,我的循环数组只能储存maxSize-1个数据

package 算法.Queue;

import java.util.Scanner;

public class CircleArrayQueueDemo {//用循环数组模拟队列

    public static void main(String[] args) {
        CircleArrayQueue circlequeue=new CircleArrayQueue(4);
        Scanner input=new Scanner(System.in);
        String n;
        boolean loop=true;
        while (loop){
            System.out.println("s(show):显示所有数据");
            System.out.println("a(add):向队列中添加一个数据");
            System.out.println("g(get):取出队列头");
            System.out.println("h(head):查看队列头");
            System.out.println("e(exit):退出");
            n=input.next();
            switch (n){
                case "s":
                    circlequeue.showQueue();
                    break;
                case "a":
                    System.out.println("请输入一个数");
                    int value=input.nextInt();
                    circlequeue.addQueue(value);
                    break;
                case "g":
                    try {
                        int res=circlequeue.getQueue();
                        System.out.println("取出的数据是:"+res);
                    }catch (Exception e){
                        System.out.println(e.getMessage());
                    }
                    break;
                case "h":
                    try {
                        int res=circlequeue.headQueue();
                        System.out.println("队列的头数据为:"+res);
                    }catch (Exception e){
                        System.out.println(e.getMessage());
                    }
                    break;
                case "e":
                    input.close();
                    loop=false;
                    break;
                default:
                    break;
            }
        }

        System.out.println("程序退出");
    }
}

class CircleArrayQueue{//用数组模拟队列
    private int maxSize;//表示数组最大容量
    private int front;//队列头
    private int rear;//队列尾
    private int[] arr;//该数组用于存储数据,模拟队列

    public CircleArrayQueue(int maxSize) {
        this.maxSize = maxSize;
        this.arr=new int[this.maxSize];
        this.front = 0;
        this.rear = 0;
    }

    public boolean isEmpty(){//判断队列是否为空
        return front==rear;
    }

    public  boolean isFull(){//判断队列是否已满
        return (rear+1)%maxSize==front;
    }

    public void addQueue(int value){//向队列中添加一个数据
        if(isFull()){
            System.out.println("队列已满");
            return;
        }
        arr[rear]=value;
        rear=(rear+1)%maxSize;
    }

    public int getQueue(){//取出队列头
        if(isEmpty()){
            throw new RuntimeException("队列为空,不能取数据");
        }
        int value=arr[front];
        front=(front+1)%maxSize;
        return value;
    }

    public void showQueue(){//显示所有数据
        if(isEmpty()){
            System.out.println("队列为空,没有数据");
            return;
        }
        for (int i=front;i<front+queueSize();i++){
            System.out.println("arr["+i%maxSize+"]="+arr[i%maxSize]);
        }
    }

    public int headQueue(){//查看队列头
        if(isEmpty()){
            throw new RuntimeException("队列为空,不能无头数据");
        }
        return arr[front];
    }

    public int queueSize(){
        return (rear+maxSize-front)%maxSize;
    }
}