数组长度是MAX+1(即length)。有一个位置是不用的。插入或者删除元素后,head或tail指针要增减1(模MAX+1)
+1:
1.经典方法(from严之data structures)
head=(head+1)%(MAX+1);
2.
if(head==MAX) head=0;
else head++;
3.(from JAVA source code,ArrayDeque)只对数组长度length为2的幂时生效
head=(head+1)&(length-1);
&是按位与
原理:
假设length= 28 , length-1=11111111B,计算机字长32位;
head可取 [0,28−1] ;
当head
∈[0,28−2]
,head+1
∈[1,28−1]
,head+1和8个1相与,结果还是head+1。
当head=
28−1
,head+1=
28
=100000000B,head=(head+1)&(length-1)=100000000&011111111=0。
-1:
1.
head=(head-1+MAX+1)%(MAX+1)=(head+MAX)%(MAX+1);
2.
if(head==0) head=MAX;
else head--;
简化版可写成
head?head--;(head=MAX);
3.
head=(head-1)&(length-1);
原理:
当head ∈[1,28−1] ,head-1 ∈[0,28−2] ,head-1和8个1相与,结果还是head-1;
当head=0,head-1=-1(32个1),32个1和8个1相与,结果是8个1,即length-1(MAX)。