JAVA:数据结构(3)数组表示循环队列

public class Test {
    public static void main(String[] args) {
        cycleArrayQueue caq1 = new cycleArrayQueue(4);
        caq1.inCycleQueue(1);
        caq1.inCycleQueue(2);
        caq1.inCycleQueue(3);
        caq1.checkEachElement();
        System.out.println("-----------------------------");
        caq1.outCycleQueue();
        caq1.inCycleQueue(8);
        caq1.checkEachElement();
        System.out.println("-----------");
        caq1.outCycleQueue();
        caq1.inCycleQueue(6);
        caq1.checkEachElement();
        System.out.println("-----------------------------------------------------");
        caq1.outCycleQueue();
        caq1.checkEachElement();
    }
}


class cycleArrayQueue{
    private int maxSize;// 数组的容量(存储数据的个数-1),因为其中一个空间用来当做判断队列是否已满的标志
    private int[] arr;// 存储数据介质——数组
    private int front;// 头指针
    private int rear; // 尾指针

    //构造方法创建环形队列
    public cycleArrayQueue(int maxSize){
        this.maxSize = maxSize;
        arr = new int[this.maxSize];
        front = rear = 0;//初始化rear和front
    }
    //判断队列空
    public boolean isEmpty(){
        return rear == front;
    }
    //判断队列满
    public boolean isFull(){
        return (rear+1)%maxSize == front;
    }
    //入列
    public void inCycleQueue(int n){
        if(isFull()){
            System.out.println("队列满,无法入列");
        }else{
            arr[rear] = n;// 为什么要把n给arr[rear]呢? 因为front只有在出队列的时候才会用,
            // 而rear会随着入列向后移,所以要把n赋给未后移之前的arr[rear],然后再后移rear.
            rear = (rear+1)%maxSize;  //考虑数组越界的时候,只需要考虑front和rear都在maxSize-1的情况,
            // 其它不用考虑,(想到)++即可(千万别直接写++)。
        }
    }
    //出列
    public int outCycleQueue(){
        if(isEmpty()){
            throw new RuntimeException("队列空,无法出列"); // 这里抛出异常的原因是返回值类型为int,return啥都不好,只能抛出异常了。
        }else{
            int value = arr[front];
            front = (front+1)%maxSize; //考虑数组越界的时候,只需要考虑front和rear都在maxSize-1的情况,
            // 其它不用考虑,(想到)++即可(千万别直接写++)。
            return value;
        }
    }
    //元素遍历
    public void checkEachElement(){
        if(isEmpty()){
            throw new RuntimeException("队列空,无法遍历");
        }else{
            for(int i=front;i<front+count();i++){
                System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);//这个地方一定要返回i%maxSize,不然会有arr[4]这种情况出现。
            }
        }
    }
    //遍历时需要用的从front到front+count其中的(count)
    public int count(){
        return (rear+maxSize-front)%maxSize;
    }

}

//以下是输出结果,经过测试所有功能全部正常

arr[0]=1
arr[1]=2
arr[2]=3
-----------------------------
arr[1]=2
arr[2]=3
arr[3]=8
-----------
arr[2]=3
arr[3]=8
arr[0]=6
-----------------------------------------------------
arr[3]=8
arr[0]=6

所有注意事项以及“小算法”涉及的点,全部都在注释中,若有疑问,请参考《尚硅谷数据结构——韩顺平》


版权声明:本文为weixin_51852915原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。