队列-环形数组实现(3种方法)

方案一

还是先创建头尾指针,和一个数组,创建对象调用构造方法时,传入数组的容量,+1是因为要留出一个位置单独给尾指针(后续会详细说到)。

添加和删除元素时指针移动情况:

添加元素时,在队列尾部添加元素,所以当添加一个元素之后,就要使尾指针向后移动一位,当删除元素时,因为是环形数组,并不需要考虑数据移动的问题,所以删除元素之后,只需要将头指针向前移动一位即可,这样当全部都删除完之后,我们的头指针和尾指针又会重合。

当添加元素添加到头尾指针重合时,此时数组中元素满了,但是因为不能使判断队列是否满或空的条件一致,这时我们就需要用到上文的在调用构造方法时,在传入的容量给数组使需要加一那个条件,将那个索引就给尾指针停歇,并不存储元素,判断条件就为尾指针加1等于头指针时,判断队列满了。

方法如下

关于元素的方法

先判断是否为满,满了就不添加并返回false,不为空就把传入的值赋值给当前索引,并把尾指针向前移动一位。

分别为删除元素并返回被删除的元素和只返回元素的方法。

删除可能并没有将头指针的元素删除,只是向后移动了一位,这是我考虑过的问题,但是再想一想,我们只需要当成被删除,在再添加元素时,就会被覆盖,或者当尾指针指向当前索引时,当前索引是默认没有添加元素的即可。

方案二

改动的地方不大,只是引入了一个变量size,来代表数组中元素个数,此时我们的构造方法中的数组长度就不用加一,然后在删除和添加元素时对size进行正确性的维护即可,最后判断空或满时,我们仅仅需要对size进行判断即可,如上所示。

方案三

相比于方案二,做出的改动为取消了size辅助判断空或满的方法,而是只用head,tail来判断,在使用时换算成索引值即可,这么说可能有些不好理解,大概意思为head和tail不再是索引,而是一个不断增加的值,只是在需要时将其换算成索引即可,这样当队列为空时,条件就是head=tail,空就是上图所示,head和tail的差值不会出现负数,放心使用即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值