0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

实现一个双端队列的步骤简析

算法与数据结构 来源:小K算法 作者:小K算法 2022-10-27 18:11 次阅读

01 故事起源

队列是一种先进先出的数据结构。
a891d4e6-3e14-11ed-9e49-dac502259ad0.jpg  

一般通过数组实现。

a8bd1354-3e14-11ed-9e49-dac502259ad0.jpg  

还需要定义2个指针,头指针和尾指针。

a8f89a78-3e14-11ed-9e49-dac502259ad0.jpg  

02 插入和删除

2.1 插入

从队尾tail处插入,再将tail指针后移。

a93c3d00-3e14-11ed-9e49-dac502259ad0.jpg

2.2 删除

从队首head处取出元素,再将head指针后移。

a969c1b2-3e14-11ed-9e49-dac502259ad0.jpg  

但数组是定长的,如果多次插入删除,tail指针就会超出数组范围,而前面其实还是有空间的,所以常用的还是循环队列。

a98706c8-3e14-11ed-9e49-dac502259ad0.jpg  

03 循环队列

循环其实就是让head,tail两个指针在数组内循环移动,当移动到队尾时就跳到队首。

a9c7016a-3e14-11ed-9e49-dac502259ad0.jpg  

通过取模就可以实现循环。

a9d96dc8-3e14-11ed-9e49-dac502259ad0.jpg  

当head==tail时,即为队空。

aa0175de-3e14-11ed-9e49-dac502259ad0.jpg  

当head==(tail+1)%n时,即为队满。如果队列长度为n,则只能装n-1个元素,最后一个元素要空着。因为如果放入元素,tail会和head重合,就无法判断是队空还是队满。

aa144b00-3e14-11ed-9e49-dac502259ad0.jpg    

04 双端队列

普通队列只能队首出,队尾进,但有时我们需要队首和队尾都能进出,即双端队列。

aa29a5d6-3e14-11ed-9e49-dac502259ad0.jpg

4.1 插入

队首插入,则head指针前移;队尾插入,则tail指针后移。

aa5445a2-3e14-11ed-9e49-dac502259ad0.jpg

4.2 删除

队首删除,则head指针后移;队尾删除,则tail指针前移。

aa81d4b8-3e14-11ed-9e49-dac502259ad0.jpg  

05 代码实现

实现一个模板,以后可重复利用。

先定义必要的方法和变量。

pYYBAGNaWfKASN9WAADxGnPQSWY163.jpg

构造函数


pYYBAGNaWgaAe_rcAAA7pt2b8w8036.jpg

插入

pYYBAGNaWhqAMxtzAACZlor3Pqg744.jpg

删除

pYYBAGNaWjWAIjFIAACbiK6QEao611.jpg

size方法

poYBAGNaWkiAZQ7kAAA6IiPLzO0989.jpg

使用案例

poYBAGNaWmiAVn6gAADaowX09qA627.jpg


06 总结

队列是非常基础且重要的数据结构,双端队列属于队列的升级。很多的算法都是基于队列来实现,例如搜索中的bfs,图论中的spfa,计算几何中的melkman等。队列结构本身很简单,如何使用才是比较难的,一定要深刻理解,以后才能熟练应用到不同的模型中。




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • BFS
    BFS
    +关注

    关注

    0

    文章

    9

    浏览量

    2129

原文标题:如何实现一个双端队列?

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【设计技巧】rtos的核心原理

    rtos的核心原理rtos全称real-time operating system(实时操作系统),我来简单分析下:我们都知道,c语句中调用函数后,该函数的返回地址都是放在堆栈
    发表于 07-23 08:00

    如何用电阻设定增益的单至差分转换器

    用电阻设定增益的单至差分转换器
    发表于 02-25 06:53

    如何去实现STM32串口缓冲循环队列接收数据呢

    如何去实现STM32串口缓冲循环队列接收数据呢?
    发表于 12-07 06:31

    TTL门电路输入

    高电平因为这时可以看作是输入端接了无穷大的电阻。TTL反相器的输入悬空(R=无穷)时,输出必为低电平。也就是说,从输出看过去,相当于输入了高电平信号,所以TTL输入悬空状态和输
    发表于 01-25 08:23

    如何实现ROS服务

    如何实现ROS服务呢?有哪些实现步骤
    发表于 02-14 06:16

    实现队列环形缓冲的方法

    串口队列环形缓冲区队列串口环形缓冲的好处代码实现队列  要实现队列环形缓冲,还需要
    发表于 02-21 07:11

    RT-Thread之等待队列的定义及使用方法

    队列的条件 key,并未实现。如果有需要使用到等待队列的场景不要擅自修改源码,因为 RTT 设备框架 大量使用了,擅自修改会导致报错,自己可以参考官方的实现重造
    发表于 04-11 10:40

    Armv8.1-M PAC和BTI扩展

    1、Armv8.1-M PAC和 BTI 扩展Armv8-M通过Trustzone for Armv8-M, Memory Protection Unit (MPU) 和Privileged
    发表于 08-05 14:56

    Rockchip RK3399 Linux4.4 USB DTS配置步骤

    1、Rockchip RK3399 Linux4.4 USB DTS配置步骤本文档提供RK3399 USB DTS的配置方法。RK3399支持两Type-C USB3.0(Typ
    发表于 08-10 16:10

    OpenHarmony应用核心技术理念与需求机遇

    、核心技术理念 图片来源:OpenHarmony官方网站 二、需求机遇 新的万物互联智能世界代表着新规则、新赛道、新切入点、新财富机会;各WEB网站、客户( 苹果APP、安卓
    发表于 09-22 16:12

    深度解析数据结构与算法篇之队列及环形队列实现

    对尾的位置。 02 — 环形队列实现 要想将元素放入队列我们必须知道对头和队尾,在队列长度不能无限大的条件下我们还要知道队列的最大容量,我
    的头像 发表于 06-18 10:07 1646次阅读

    嵌入式环形队列和消息队列实现

    嵌入式环形队列和消息队列实现数据缓存和通信的常见数据结构,广泛应用于嵌入式系统中的通信协议和领域。
    的头像 发表于 04-14 11:52 1063次阅读

    嵌入式环形队列和消息队列是如何去实现的?

    嵌入式环形队列和消息队列实现数据缓存和通信的常见数据结构,广泛应用于嵌入式系统中的通信协议和领域。
    发表于 05-20 14:55 671次阅读

    单片机消息队列实现原理和机制

    单片机开发过程中通常会用到“消息队列”,一般实现的方法有多种。 本文给大家分享一下队列实现的原理和机制。
    的头像 发表于 05-26 09:50 885次阅读
    单片机消息<b class='flag-5'>队列</b>的<b class='flag-5'>实现</b>原理和机制

    两个栈实现一个队列方法

    数据结构,同时也存在某种联系。用栈可以实现队列,用队列也可以实现栈。 两个栈实现一个队列 思路:
    的头像 发表于 10-08 15:54 581次阅读