队列中的队列模数和去队列方法?

时间:2013-12-20 00:55:52

标签: java queue

所以我有这个代码我需要分析并从中学习,关于有界队列如何工作,这里是:

class Queue<T> { // bounded

    private T[] seq; // the sequence
    private int size = 0; // size of sequence
    private int head = 0; private int tail = 0; // front and rear

    Queue(int n) { // n>0
        seq = (T[])(new Object[n]); 
    }

    Queue(){ this(10000);} // =  seq=(T[])(new Object[10000]);

    boolean isEmpty() { return size==0;}

    boolean enq(T t) { 
        if (size<seq.length) {
                seq[tail] = t; tail = (tail+1)%seq.length; size++; 
                return true;
        }
        else return false;
    }

    T deq() {
        if (isEmpty()) return null;
        else {
            T temp = seq[head];
            head = (head+1)%seq.length; size--;
            return temp;
        }
    }
}

所以一切都很好,但我不明白为什么在上帝的名义中%方法和enq(T t)方法中存在模数(deq())...

1 个答案:

答案 0 :(得分:2)

有一个模运算,以便队列可以用数组表示,其中队列的内容将数组的末尾“环绕”到开头。

大小为10的示例:

[6th] [tail] [empty] [empty] [empty] [head] [2nd] [3rd] [4th] [5th]

此处,head = 5,tail = 1,因为总共添加了12个项目并删除了5个项目。即使阵列末尾没有足够的空间,阵列的开头也有空间存储更多数据,直到阵列的容量为止。

模数运算允许headtail分别绕过deqenq操作,以便9成为{{1}而不是0,这会导致10