我对队列中的算法不太了解

时间:2015-03-27 17:55:07

标签: c++

这是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号索引,它没有存储在其中的值,这必定是一个巨大的错误。但是,这段代码是正确的,因为它是罗伯特塞奇威克,我们是错误的。男人们怎么了? :(

2 个答案:

答案 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.