这是Robert Sedgewick的书中使用数组实现的队列:
class QUEUE {
private:
int* q;
int N;
int head;
int tail;
public:
QUEUE(int maxN) {
q = new int[maxN + 1];
N = maxN + 1; head = N; tail = 0;
}
int empty() const {
return head % N == tail;
}
void put(int item) {
q[tail++] = item; tail = tail % N;
}
int get() {
head = head % N; return q[head++];
}
};
我关心的是get()
方法。
考虑大小为10;
根据代码,最初,head = 11的索引和tail的索引= 0。
现在,添加一个元素,比如说1.因此,1位于索引位置0,尾部位置增加到1。 现在添加另一个说法5. 5在索引pos 1处,尾部现在是索引2。
现在使用get()函数,它执行:return q[head++];
,它返回头部的元素,然后增加头部,但是BOOOOOM !!!!!正如我们刚刚看到的那样,头部是11号索引,它没有存储在其中的值,这必定是一个巨大的错误。但是,这段代码是正确的,因为它是罗伯特塞奇威克,我们是错误的。男人们怎么了? :(
答案 0 :(得分:0)
你错过了`
head = head % n; // this mean head is now the remainder of the division
// between head and N`
这意味着头不再是10;
head = 11 % 11
which is 0 as the remainder of this division is zero.
Therefore, head = 0;
然后当你返回q [head ++]时,你返回q [0],然后你将头设置为1.
答案 1 :(得分:0)
如果你创建一个大小为10的队列,那么head等于10.我们使用
head = head % N;
head = 10 % 10
head = 0
所以head为0然后我们将它增加到1.