【队列】|单调队列 | 模拟队列 | 队列的创建和相关的使用

一,队列的基本定义和解释

队列是一种简单的数据结构,首先我们可以知道队列是一种有 ,两种操作,并且我们存储相关的关系的时候,我们还要进行相关的数据结构的存储,所以我们要开一个数组单位来存储这个队列的单位元素。然后为了完成这个基本的出入操作,我们可以把这个数据结构改造成一个双指针的数据结构,我们在头结点尾结点分别设置一个指针,来完成这个数据结构。

在这里插入图片描述队列中模拟队列,就是我们使用数组来进行模拟出来数据结构的一系列操作,这种操作非常简单,一般来说我们使用队列能做到的事情,我们使用模拟队列也能完成,所以我们通常使用模拟队列的方式进行计算,还有就是单调队列,首先我们要理解单调队列的思想,首先他存储的数列是一段有顺序的队列,我们因为某种情况导致整个数组中的某些值不能取,这样我们能很好的减小一下数据范围,这种类型我们一般是在数据范围比较小的时候进行,但是数据比较多,我们使用整个办法完成数据的减小瘦身操作。

二,模拟队列

众所周知,模拟队列有几个基本操作: 入队出队 ,判断是否为空的操作

1,队列的创建
const int  N  = 100010 ; 

int q[N] , hh , tt = - 1 ;
2,队列的出队操作
tt ++ ;
3,队列的入队操作
int x ;
cin >> x; 
q[++ tt] = x ;
4,判断队列是否为空的操作
return tt < hh ; 

三,单调队列操作

1,算法引入

单调队列的出现是解决类似滑动窗口类似的问题,我们要解决一段区域内的某些最值操作,这个区域是比最大区域小的一个区域,一般来说这个区域是恒定的,并且在这个区域中或者说是数据中我们能知道他有一定的顺序关系,我们暂且把这种数据关系在数值上的表现为 cnt数值,我们在队列中按照顺序存储这种数值,当合适的时候输出这些数值。

2,算法思路

快速计数:记入在[n,m]区间里面有多少数据: m - n + 1 就能完成计算

  1. 我们首先要思考的问题是这个队列是有多长,我们在什么时候应该 hank 头部的数据——我们一般情况下我们在这个 i - hh + 1 >= m(现在的位数 大于等于 队列能存储的最大值) 的时候进行这个操作
  2. 同时我们要考虑的是我们如何保证这个数据是单调的存储 —— 一般情况下,我们保证队列不是空 hh <= tt 并且我们要保证的是队尾的cnt值不满足单调性
3,常规代码
#include <iostream>
#include <algorithm>
using namespace std ;

const int N = 1000100 ;

int q[N] ,hh , tt = - 1 , g[N];

int main ()
{
    int n , m ; 
    cin >> n >> m ;
    for(int i = 0 ; i < n ; i ++ )
    {
        int x ;
        cin >> x ;
        g[i] =  x; 
      //  cout << i - q[hh] + 1 << endl ; 
        if(i - q[hh] + 1 > m)      hh ++ ;
        while(hh <= tt && x >= q[tt])   tt -- ;
        q[++ tt ] = i ;
        if(i >=  m - 1)     cout << g[q[hh]] << " ";  
    
}

    return 0 ;
}

这个操作就是滑动窗口中的的相关的求最大值的操作,我们来看的就是一个完美的数值比较的单纯的单调队列的操作,可以根据代码来进行更加深入的了解

后续遇到相关的板子题也会进行相关的补充;
—————————————————————分割线2023/7/15——————————————————————

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值