1

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

我已经咨询了一些 TA 可能出了什么问题,并搜索了 StackOverflow 以前的问题,但都没有产生积极的结果。

任何帮助将不胜感激。

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;
}
4

1 回答 1

0

isFull判断有问题。假设您将队列的大小初始化为 1,然后执行一个enqueue操作。这时候,isFull会返回true,导致你无法入队这个项目。

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;
    }
}
于 2021-12-10T06:30:07.207 回答