不理解队列实现的代码

时间:2017-07-23 13:38:49

标签: java queue

我很难理解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;
    }
}

1 个答案:

答案 0 :(得分:1)

尝试可视化项目在内部queueArr[]数组中的存储方式。 这不是你怎么做的天真,但让我们先来看看这个概念。

天真的概念中,您将队列的第一个元素存储在queueArr[0],将第二个存储在{{1} },queueArr[1]处的最后一个元素,依此类推。

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

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

想象一下你有一个完整的阵列。然后删除第一个元素,第一个插槽queueArr[queueArr.length - 1]现在为空。现在你想在最后插入一个新元素。您现在将其插入queueArr[0]并重用该空白区域。

由于数据结构开始和结束的位置现在是可变的,您需要使用queueArr[0]rear变量记住它。

这是一张小型Google搜索结果的图片,展示了这种技术:

Queue Cyclic Array

条件frontrear == capacity - 1现在正好处理我上面描述的情况。如果数组已满但在开始索引中有间隙,则在那里插入新元素,因此数组的front == capacity - 1位于开始索引处。 在上面rearrear位于queueArr.length - 1的示例中,之后为0

详细说明:
rear == capacity - 1指针位于数组的右端后,true会解析为rear(请注意capacity与{{1}相同}})。
如果它解析为queueArr.length,则代码执行true,将指针设置回数组的开头。因此,它从左到右徘徊,然后从阵列回到左边。

类似于rear = 0;指针。

请注意,这个概念只是因为队列不允许删除或插入其中而有效,您只能在开头或结尾处更改某些内容。否则内部数据将不再连接。