循环数组实现单调队列和解决滑动窗口

1.循环数组实现单调队列

1.1 普通队列实现

  • 普通的队列数据结构:先进先出,这里的“进”就是数据从队列的尾进,这里的“出”就是从队列的头出。
  • 很显然循环数组队列比单方向的数组队列的效率更高,更优,这里我就不再过多赘述。

1.1.1定义循环队列(循环队列的结构)

(1)首先是如何确定队列的“首尾”,这里我用两个变量head,tail,它们分别存储着循环队列首尾元素的数组下标
(2)如何实现循环?:注意因为队列的元素一定是在 head–tail之间的,而很显然,这可以有两种情况吧,一种是顺势针,一种是逆时针,如下图,为了方便我们选择顺时针这种情况
请添加图片描述

(3)如何利用head和tail的位置关系推断出队列空还是满如上图所示,数组有5个空间,那么队列数据的存放就有6种情况,,分别是0个,1个。。。。5个,那么head和tail的相对情况则只有5种,分别是 0(tail=head),1(tail与head相邻),2(相隔一个空间)。。4(相隔三个空间)。那么这里我们用5种情况去表示6种状态,很显然一定会有1种情况表示了两种状态,很显然不行

  • 对此解决方法是我们留一个空间不用,这样队列数据的存放情况就少了一种(比如上图我们最多能放4个数据,就只有5种情况)。
  • (4)这里我进行了一些小改变,为了方便,**head变量存储着队首元素的坐标,而tail变量这里存储为空,但是它“”前面的“”一个位置,存储着队列的尾元素坐标,如下图

1.1.2循环队列的操作(outqueue、inqueue)

用此图为例

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值