环形队列(java)


思路

环形队列需要使用到取余%

1:判断队列是否已经满了(rear+1) % maxSize == front;,给队尾加一取余如果和指向对头的front一样就表示队列已经满了

2:判断队列是否为空 rear == front;,当队尾和对头相等时,队列就为空

3:队尾,rear = (rear+1)%maxSize;队尾向后移动,同时取余队列大小,不让队尾超出范围,实现环形;

4:队列的有效个数(rear + maxSize - front)%maxSize;因为队列中留出了一格不会存放数据,所以rear+maxSize相加不会出现(rear + maxSize - front)%maxSize==0的情况,同时(rear + maxSize - front)确保了不会为负数,%确保了始终是环形

****代码
`
public class A02_ArrayQueue {
public static void main(String[] args) {
ArrayQueue queue = new ArrayQueue(8);
Scanner sc = new Scanner(System.in);
char key = ''

    boolean isFlag = true;
    while (isFlag) {
        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):退出队列");

        System.out.println("请输入选择(s/a/g/h/c):");
        key = sc.next().charAt(0);

        switch (key) {
            case 's':
                queue.showQueue();
                break;
            case 'a':
                if (queue.isFull()) {
                    System.out.println("队列满了,请重新选择~~");
                    break;
                }
                System.out.println("请输入要添加的数字:");
                int n = sc.nextInt();
                queue.addQueue(n);
                break;
            case 'g':
                if (queue.isEmpty()) {
                    System.out.println("队列空了,请重新选择~~");
                    break;
                }
                queue.getQueue();

            case 'h':
                queue.headQueue();
                break;

            case 'e':
                sc.close();
                isFlag = false;
                break;

            default:
                break;

        }

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

class ArrayQueue{
private int maxSize; //数组最大容量
private int front; //队列头
private int rear; //队列尾
private int[] arr; //存放数据

//初始化队列
public ArrayQueue(int maxSize){
    this.maxSize = maxSize;
    arr = new int[this.maxSize];
}


//判断队列是否已经满了
public boolean isFull(){
    //判断队列的尾部后移一个位置如果等于队列头就表示队列满了
    return (rear+1) % maxSize == front;
}


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


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

//取出队列头部
public int getQueue()  {
    if(isEmpty()){
        System.out.println("队列为空");
        try {
            throw new Exception("队列为空");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    int value = arr[front];
    front = (front+1)%maxSize;
    return value;
}

//返回队列中的有效个数
public int size(){
    return (rear + maxSize - front)%maxSize;
}

public void showQueue(){
    if(isEmpty()){
        System.out.println("队列为空");
        return;
    }
    for(int i = front;i

}
`

https://blog.csdn.net/wangjiaju960914/article/details/119959066