--- java数据结构 队列 ---

队列

队列是在队列的末位进行数据的插入,在队列的头进行数据的删除,很类似与我们日常中的排队

可以用链表实现,那么链表的头指针就是队列的头,链表的尾指针也就是队列的尾

 也可以用数组实现,但如果是是在数组要满的时候对数组进行扩容这个方法去储存数据的话,数组的空间利用率很低,这时我们就可以用环形队列 即将数据的插入在数组中形成一个环,当插入到数组最后一个下标后,再插入数据就是插入数组的0号位置

环形队列的实现

字段的设计

对于数据的判满是舍弃一个空间来判满,这样当top等于end时是空,但如果不舍弃一个空间判断满

这样就不能分辨出top等于end是空还是满,因为我们的end所指向的位置是没有储存有效数据的

当然也可以使用一个size去记下有效数据的个数

push 插入

对于数据的插入也即是直接插入到top指向的位置,然后将now指向该位置,方便得到队尾的元素

然后对top++走到下一个插入点,对于top的走向,因为如果是长度为5的数组,top的取值也只能是

0 1 2 3 4 所以top需要%5也就是数组的长度,这样当top走到最后4的时候,再向下走1那么就是0

对于判满,也就是但top+1 == end是,为满,不过top+1可能会超出数组范围

比如但top = 4 end = 0 top+1 = 5 这显然是错误的,那么正确的其实是需要%数组长度

(top+1)%size == end

pop 删除

将end向后移动一位即可 不过end也会大于size所以也需要%数组大小

peek

获得的是队尾的元素,也就是now指向的元素

isEmpty 是否为空

当top == end是即认为为空

使用链表去实现

字段设计

head是对头删除元素的位置,end是队尾插入元素的位置

offer插入元素

 也即是普通俩表的为尾插

poll 删除

也就是链表的头删

peek

end指向的是俩表尾巴的数据所以直接返回end.val就行,因为在插入时先给 next赋值再走到next

isEmpty

直接看head是否为空

对环形链表 空间利用率高,但是大小固定

但是对于链表来说,就不会存在空间浪费 和大小不够的情况 推荐

下一篇 二叉树 干

end~~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值