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

    浏览量

    2170

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

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

收藏 人收藏

    评论

    相关推荐

    新能源电池产业链及投资机会-磷酸亚铁锂

    新能源电池产业链及投资机会-磷酸亚铁锂  、前言
    发表于 12-25 09:34 992次阅读

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

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

    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

    PCB线路板电镀铜工艺

    PCB线路板电镀铜工艺   .电镀工艺的分类:   酸性光亮铜电镀电镀镍/金电镀锡   二.工艺流程:
    发表于 11-17 14:01 4026次阅读

    EPON技术

    EPON技术 EPON是新技术,用于保证提供高品质与高带宽利用率的应用。   
    发表于 01-22 10:43 869次阅读

    BGA封装技术与质量控制

    BGA封装技术与质量控制   SMT(Surface Mount Technology)表面安装技术顺应了电子产品小型化、轻型化的潮流趋势,为实现电子
    发表于 03-30 16:49 1488次阅读

    鼠标HID例程(中)

    鼠标 HID 例程 紧接《鼠标 HID 例程(上)》文,继续向大家介绍鼠 标 HID 例程的未完的内容。
    发表于 07-26 15:18 0次下载

    用电阻设定增益的单至差分转换器资料下载

    电子发烧友网为你提供用电阻设定增益的单至差分转换器资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 04-04 08:46 3次下载
    <b class='flag-5'>简</b><b class='flag-5'>析</b>用电阻设定增益的单<b class='flag-5'>端</b>至差分转换器资料下载

    TencentOS-tiny中环形队列实现

    1. 什么是队列队列(queue)是种只能在一端插入元素、在另一端删除元素的数据结构,遵循「先入先出」(FIFO)的规则。 队列中有两
    的头像 发表于 10-08 16:30 1383次阅读

    5G AAU 功放控制和监测模块

    5G AAU 功放控制和监测模块
    发表于 10-28 12:00 2次下载
    5G AAU 功放控制和监测模块<b class='flag-5'>简</b><b class='flag-5'>析</b>

    利用C++提供的队列封装消息队列

    最近的C++项目中,需要用到消息队列,但是C++中又没有原生的消息队列,就在网上找了下相关资料,利用C++提供的队列,自己封装
    的头像 发表于 05-20 15:16 1871次阅读
    利用C++提供的<b class='flag-5'>队列</b>封装<b class='flag-5'>一</b><b class='flag-5'>个</b>消息<b class='flag-5'>队列</b>

    队列和C++ std::deque的用法说明

    队列实际上是队列种变形,队列要求只能在队尾添加元素,在队头删除元素,而
    的头像 发表于 07-18 17:43 627次阅读
    <b class='flag-5'>双</b><b class='flag-5'>端</b><b class='flag-5'>队列</b>和C++ std::deque的用法说明

    AFE8092帧同步特性

    AFE8092帧同步特性
    的头像 发表于 08-24 13:37 657次阅读
    AFE8092帧同步特性<b class='flag-5'>简</b><b class='flag-5'>析</b>

    实现队列方法

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

    岩土工程监测中振弦采集仪的布设方案及实施步骤

    岩土工程监测中振弦采集仪的布设方案及实施步骤 岩土工程监测中,河北稳控科技振弦采集仪是种常用的地下水位和土层压缩性监测工具。它通过采集振弦的振动信号来确定地下水位和土层的压缩性,
    的头像 发表于 05-06 13:25 256次阅读
    岩土工程监测中振弦采集仪的布设方案及实施<b class='flag-5'>步骤</b><b class='flag-5'>简</b><b class='flag-5'>析</b>