数组实现的队列(限制最大长度)的head、tail指针的修改方法。

数组长度是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,281] ;

当head [0,282] ,head+1 [1,281] ,head+1和8个1相与,结果还是head+1。
当head= 281 ,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,281] ,head-1 [0,282] ,head-1和8个1相与,结果还是head-1;

当head=0,head-1=-1(32个1),32个1和8个1相与,结果是8个1,即length-1(MAX)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值