【发布时间】:2017-09-28 17:49:57
【问题描述】:
我正在阅读一本 java 算法书。实现队列的一种方法是不使用 nitems 字段来检查队列是空的还是满的。以下是我试图绕过的方法。我试图通过在白板上绘制数组等来理解这一点,但没有清楚的理解。
你们中的任何人都可以对下面的代码有所了解吗?感谢您花时间看这个。
public boolean isFull() // true if queue is full
{
return ( rear+2==front || (front+maxSize-2==rear) );
}
补充说明:
在这种没有 nelem 的队列实现方式中,数组的大小,即“maxSize”为 (queuesize+1),例如对于 5 个元素的队列大小,maxSize 将为 6。额外的数组元素用于解决队列同时显示为空和满的情况。
其中“rear”字段是数组中的位置,当有新元素插入队列时,它会更新,因为队列是先进先出的。 "插入新元素时不会更新front。
“front”字段是队列中第一个元素的位置,即调用remove方法时将从队列中弹出的元素。
以下是书中的完整算法,以防我的解释不清楚。我想我理解 isEmpty 方法,但是 isFull 方法对我来说不是很清楚。
class Queue
{
private int maxSize;
private long[] queArray;
private int front;
private int rear;
//--------------------------------------------------------------
public Queue(int s) // constructor
{
maxSize = s+1; // array is 1 cell larger
queArray = new long[maxSize]; // than requested
front = 0;
rear = -1;
}
//--------------------------------------------------------------
public void insert(long j) // put item at rear of queue
{
if(rear == maxSize-1)
rear = -1;
queArray[++rear] = j;
}
//--------------------------------------------------------------
public long remove() // take item from front of queue
{
long temp = queArray[front++];
if(front == maxSize)
front = 0;
return temp;
}
//--------------------------------------------------------------
public long peek() // peek at front of queue
{
return queArray[front];
}
//--------------------------------------------------------------
public boolean isEmpty() // true if queue is empty
{
return ( rear+1==front || (front+maxSize-1==rear) );
}
//--------------------------------------------------------------
public boolean isFull() // true if queue is full
{
return ( rear+2==front || (front+maxSize-2==rear) );
}
//--------------------------------------------------------------
public int size() // (assumes queue not empty)
{
if(rear >= front) // contiguous sequence
return rear-front+1;
else // broken sequence
return (maxSize-front) + (rear+1);
}
//--------------------------------------------------------------
} //
谢谢!
拉古
【问题讨论】:
-
算法很有意思,谢谢分享!我用一个例子写了一个答案,展示了 isFull() 的工作原理。如果您觉得不错,我可以请您通过单击答案旁边的灰色复选标记将其变为绿色来接受答案吗?也非常感谢您的支持:-)
-
@Assafs 记住新手在某些时候接受答案是很好的。但是请:给他一些时间来消化你的意见。在写完答案后 1 分钟提出此请求确实是不常见的赞赏做法。
-
我明白了,我不是故意的。感谢您的友好评论。