我很难理解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]
并重复使用该空白空间。
由于数据结构的开始和结束位置的含义现在是变量,因此需要使用rear
和front
变量来记住。
这是一幅Google搜索量小的图片,展示了此技术:
现在,条件rear == capacity - 1
和front == capacity - 1
可以正确处理上述情况。如果数组已满,但起始索引处有间隙,则在其中插入新元素,因此数组的rear
在起始索引处。
在上面的示例中,rear
首先在queueArr.length - 1
处,然后在0
处。
详细地:
一旦rear == capacity - 1
指针位于数组的右端,则true
解析为rear
(请注意capacity
与queueArr.length
相同)。
如果解析为true
,则您的代码将执行rear = 0;
,这会将指针设置回数组的开头。因此,它从左到右徘徊,然后再从左到右穿过数组。
与front
指针类似。
请注意,该概念仅在队列不允许在其间进行删除或插入时才有效,您只能在开始或结尾处进行更改。否则内部数据将不再连接。