我很难理解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;
}
}
答案 0 :(得分:1)
尝试可视化项目在内部queueArr[]
数组中的存储方式。
这不是你怎么做的天真,但让我们先来看看这个概念。
在天真的概念中,您将队列的第一个元素存储在queueArr[0]
,将第二个存储在{{1} },queueArr[1]
处的最后一个元素,依此类推。
但是,如果有一个新元素或者应该删除一个元素,你会怎么做?然后,您需要创建一个具有更大容量的新阵列,并将所有内容复制到新阵列,或者之间存在间隙。
您的队列实施具有更好的概念,它将元素循环存储在数组中。
想象一下你有一个完整的阵列。然后删除第一个元素,第一个插槽queueArr[queueArr.length - 1]
现在为空。现在你想在最后插入一个新元素。您现在将其插入queueArr[0]
并重用该空白区域。
由于数据结构开始和结束的位置现在是可变的,您需要使用queueArr[0]
和rear
变量记住它。
这是一张小型Google搜索结果的图片,展示了这种技术:
条件front
和rear == capacity - 1
现在正好处理我上面描述的情况。如果数组已满但在开始索引中有间隙,则在那里插入新元素,因此数组的front == capacity - 1
位于开始索引处。
在上面rear
中rear
位于queueArr.length - 1
的示例中,之后为0
。
详细说明:
rear == capacity - 1
指针位于数组的右端后,true
会解析为rear
(请注意capacity
与{{1}相同}})。
如果它解析为queueArr.length
,则代码执行true
,将指针设置回数组的开头。因此,它从左到右徘徊,然后从阵列回到左边。
类似于rear = 0;
指针。
请注意,这个概念只是因为队列不允许删除或插入其中而有效,您只能在开头或结尾处更改某些内容。否则内部数据将不再连接。