我很难理解Java中队列实现的某些部分。我需要帮助来了解代码。我是编程新手。这不是我的代码。如果有人举一个小例子来解释,这将很有帮助。

enqueue方法中,rear == capacity - 1条件做什么?

dequeue方法中,front == capacity - 1条件做什么?

public class QueueImpl {

    private int capacity;
    int queueArr[];
    int front = 0;
    int rear = -1;
    int currentSize = 0;

    public QueueImpl(int queueSize){
        this.capacity = queueSize;
        queueArr = new int[this.capacity];
    }

    /**
     * this method adds element at the end of the queue.
     * @param item
     */
    public void enqueue(int item) {
        if (isQueueFull()) {
            System.out.println("Overflow ! Unable to add element: "+item);
        } else {
            rear++;
            if(rear == capacity-1){
                rear = 0;
            }
            queueArr[rear] = item;
            currentSize++;
            System.out.println("Element " + item+ " is pushed to Queue !");
        }
    }

    /**
     * this method removes an element from the top of the queue
     */
    public void dequeue() {
        if (isQueueEmpty()) {
            System.out.println("Underflow ! Unable to remove element from Queue");
        } else {
            front++;
            if(front == capacity-1){
                System.out.println("Pop operation done ! removed: "+queueArr[front-1]);
                front = 0;
            } else {
                System.out.println("Pop operation done ! removed: "+queueArr[front-1]);
            }
            currentSize--;
        }
    }

    /**
     * This method checks whether the queue is full or not
     * @return boolean
     */
    public boolean isQueueFull(){
        boolean status = false;
        if (currentSize == capacity){
            status = true;
        }
        return status;
    }

    /**
     * This method checks whether the queue is empty or not
     * @return
     */
    public boolean isQueueEmpty(){
        boolean status = false;
        if (currentSize == 0){
            status = true;
        }
        return status;
    }
}

最佳答案

尝试可视化项目如何存储在内部queueArr[]数组中。
这不是您幼稚的方式,但是让我们首先看一下这个概念。



在幼稚的概念中,您将队列的第一个元素存储在queueArr[0]处,将第二个元素存储在queueArr[1]处,将最后一个元素存储在queueArr[queueArr.length - 1]中,依此类推。

但是,如果有新元素出现或应该删除一个元素,您将怎么办?然后,您需要创建一个具有更大容量的新阵列,然后将所有内容复制到新阵列中,或者两者之间存在间隙。



您的队列实现有一个更好的概念,它将循环存储的元素存储在数组中。

假设您有一个完整的阵列。然后,您删除第一个元素,第一个插槽queueArr[0]现在为空。现在,您想在末尾插入一个新元素。现在,您将其插入queueArr[0]并重复使用该空白空间。

由于数据结构的开始和结束位置的含义现在是变量,因此需要使用rearfront变量来记住。

这是一幅Google搜索量小的图片,展示了此技术:

java - 不了解用于队列实现的代码-LMLPHP



现在,条件rear == capacity - 1front == capacity - 1可以正确处理上述情况。如果数组已满,但起始索引处有间隙,则在其中插入新元素,因此数组的rear在起始索引处。
在上面的示例中,rear首先在queueArr.length - 1处,然后在0处。

详细地:
一旦rear == capacity - 1指针位于数组的右端,则true解析为rear(请注意capacityqueueArr.length相同)。
如果解析为true,则您的代码将执行rear = 0;,这会将指针设置回数组的开头。因此,它从左到右徘徊,然后再从左到右穿过数组。

front指针类似。



请注意,该概念仅在队列不允许在其间进行删除或插入时才有效,您只能在开始或结尾处进行更改。否则内部数据将不再连接。

09-07 16:14