为什么我的循环数组队列没有添加最后输入的值?

Why is my Circular Array Queue not adding the very last inputted value?

我在使用 Java 完全实现我的循环数组队列时遇到了一些困难。具体来说,我的入队未能对队列中输入的最后一个值进行排队。我已经测试了出队和重新入队值,它工作正常,直到我尝试插入最后一个值,它不会插入任何内容。

我已经就可能出现的问题咨询了一些助教,并搜索了 Whosebug 之前的问题,但都没有得到肯定的结果。

如有任何帮助,我们将不胜感激。

public class MyQueue {
public int queue[];
public int size;
public int rear;
public int front;

public MyQueue(int mySize) {
    size = mySize;
    queue = new int[size];
    rear = 0;
    front = 0;
    }
public boolean isEmpty() {
    if(rear == front || rear == -1) {
        return true;  
    }
    else {
        return false; 
    }
}
public boolean isFull() {
    if((rear + 1)% size == front) {
        return true;
    }
    else
        return false;
}
public void enqueueMod(int item) {  
    if (this.isFull()) {
        return;
    }
    else {
        queue[rear] = item;
        rear = (rear + 1) % (size);     
    }
}
public int dequeueMod() {
    int item = -99; //-99 so i know its empty
    if(front == rear)
        return item;
    else {
        item = queue[front];
        queue[front] = 0;
        front = (front +1 ) %size;
    }
    return item;
}

isFull判断有问题。假设您将队列的大小初始化为 1,然后执行 enqueue 操作。此时isFull会return为真,导致你无法入队此物品。

public boolean isFull() {
    if((rear + 1)% size == front) {
        return true;
    }
    else
        return false;
}

简单的解决方案是使用一个额外的size字段来记录数组中元素的数量:

public class MyQueue {
    public int queue[];
    public int size;
    public int rear;
    public int front;
    public int actualSize;

    public MyQueue(int mySize) {
        size = mySize;
        queue = new int[size];
        rear = 0;
        front = 0;
        actualSize = 0;
    }

    public boolean isEmpty() {
        return actualSize == 0;
    }

    public boolean isFull() {
        return actualSize == size;
    }

    public void enqueueMod(int item) {
        if (this.isFull()) {
            return;
        } else {
            queue[rear] = item;
            rear = (rear + 1) % (size);
            actualSize++;
        }
    }

    public int dequeueMod() {
        int item = -99; //-99 so i know its empty
        if (isEmpty())
            return item;
        else {
            item = queue[front];
            queue[front] = 0;
            front = (front + 1) % size;
            actualSize--;
        }
        return item;
    }
}