java第五章循环结构总结_数据结构之循环队列(java实现)

6a9d21f0f2c0f445911c12da0ff1ae30.png

普通队列的缺点:出队的时间复杂度是O(n)

循环队列是怎么弥补这些缺点的:增加一个指向队首元素的指针(队首指针front),在出队后,该指针指向下一个元素,这样就不需要移动数据了。队尾指针tail指向可以存放数据的第一个位置,如下图所示。

41bbf3225a5d0e38c051c8c4cd38567a.png

具体介绍:

(1)当队列为空时,front和tail指针都指向第一个元素,

2021089181f843307930747a8942cfcc.png
队列为空,front=tail

(2)当入队元素时,front指向不变,tail指向后移一位,即指向下一个可以存放数据的位置

fee05ec44be6b96f823f1f52f6fdab13.png
入队,tail指针后移。

(3)当出队时,front指针后移,即指向第一个元素位置,且不需要移动元素,时间复杂度为O(1)

448d27bbdb2ba33c74d80d4d4c29abea.png
出队,front指针后移

(4)当队列后面的部分已经满了的情况下,即tail指针无法后移(后移会越界)时,且队列的前面部分却存在空间时,如下图所示。此时tail指针可以指向第一个位置,实现操作是(tail+1)%length,即(7+1)%8=0。

a5fc4a93a44bc2274da0d88260f26c39.png
4.1:tail指针已经到底,但前面还有位置可以插入。

插入元素后,tail指向唯一一个可以存放元素的位置,如下图:

e9f760b5393d3fb0ad497b00c831197f.png

如果此时再插入元素,那么tail将和front相遇,且队列不空,这和判断队列空的条件相同,所以二者矛盾。

所以人为规定牺牲掉一个空间,把队列判定满的条件设置为(tail+1)%length==front,

cbc38a5f43c54cff0a3cd76104f8ea48.png

队列接口Queue.java的定义:

//队列的接口

循环队列的实现LoopQueue.java,不再使用数组作为底层支撑,而是自己定义。

public 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值