这真的很有趣,因为我们的导师昨天正在向我们讲这个,他自己也无法弄明白。所以,我们在不知道实际原因的情况下还有点悬而未决。
以下是一本着名书籍中的队列的数组实现(我没有,但这是我的导师所说的。作者非常有名):
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++];
}
};
在构造函数中,您会看到q = new int[maxN + 1];
。但为什么' + 1' ?他为什么要分配一个额外的int内存块?
答案 0 :(得分:6)
向maxN
添加一个解决方案的问题是,如果您准确分配maxN
项,则无法区分这两种情况:
maxN
个项目。在这两种情况下,head
和tail
将彼此模等N
。
注意:实现并不理想,因为插入maxN+1
- 元素包裹队列,因此它再次变为空。这个缺点可以通过三种方式解决:
bool
,忽略溢出队列的插入,如果忽略插入则返回false
,或