数据结构 | 线性数据结构——双端队列

news2024/9/22 15:41:51

目录

一、何谓双端队列

二、双端队列抽象数据类型

三、用Python实现双端队列

四、回文检测器


一、何谓双端队列

双端队列是与队列类似的有序集合。它有一前、一后两端,元素在其中保持自己的位置。与队列不同的是,双端队列对在哪一端添加和移除元素没有任何限制。新元素既可以被添加到前端,也可以被添加到后端。同理,已有的元素也能从任意一端移除。某种意义上,双端队列是栈和队列的结合。

值得注意的是,尽管双端队列有栈和队列的很多特性,但是它并不要求按照这两种数据结构分别规定的LIFO原则和FIFO原则操作元素。具体的排序原则取决于其使用者。

二、双端队列抽象数据类型

双端队列抽象数据类型由下面的结构和操作定义。如前所述,双端队列是元素的有序集合,其任何一端都允许添加或移除元素。双端队列支持以下操作。

  • Deque(0创建一个空的双端队列。它不需要参数,且会返回一个空的双端队列。
  • addFront(item)将一个元素添加到双端队列的前端。它接受一个元素作为参数,没有返回值。
  • addRear(item)将一个元素添加到双端队列的后端。它接受一个元素作为参数,没有返回值。
  • removeFront()从双端队列的前端移除一个元素。它不需要参数,且会返回一个元素,并修改双端队列的内容。
  • removeRear()从双端队列的后端移除一个元素。它不需要参数,且会返回一个元素,并修改双端队列的内容。
  • isEmpty()检查双端队列是否为空。它不需要参数,且会返回一个布尔值。
  • size()返回双端队列中元素的数目。它不需要参数,且会返回一个整数。

三、用Python实现双端队列

在这里,我们假设双端队列的后端是列表的位置0处

class Deque:
    def __init__(self):
        self.items=[]

    def isEmpty(self):
        return self.items==[]

    def addFront(self,item):
        self.items.append(item)

    def addRear(self,item):
        self.items.insert(0,item)

    def removeFront(self):
        return self.items.pop()

    def removeRear(self):
        return self.items.pop(0)

    def size(self):
        return len(self.items)

d=Deque()
print(d.isEmpty())

d.addRear(4)
d.addRear('dog')
d.addFront('cat')
d.addFront(True)
print(d.size())
print(d.isEmpty())

d.addRear(8.4)
print(d.removeRear())
print(d.removeFront())

在双端队列的Python实现中,在前端进行的添加操作和移除操作的时间复杂度是O(1),在后端的则是O(n)。

四、回文检测器

 运用双端队列可以解决一个非常有趣的经典问题:回文问题。回文是指从前往后读和从后往前读都一样的字符串,例如radar、toot,以及madam。

该问题的解决方案是使用一个双端队列来存储字符串中的字符。按从左往右的顺序将字符串中的字符添加到双端队列的后端。此时,该双端队列类似于一个普通的队列。然而,可以利用双端队列的双重性,其前端是字符串的第一个字符,后端是字符串的最后一个字符。

由于可以从前后两端移除元素,因为我们能够比较两个元素,并且只有在二者相等时才继续。如果一直匹配第一个和最后一个元素,最终会处理完所有的字符(如果字符数是偶数),或者剩下只有一个元素的双端队列(如果字符数是奇数)。任意一种结果都表明输入字符串是回文。

from pythonds.basic import Deque
def palchecker(aString):
    chardeque=Deque()
    for ch in aString:
        chardeque.addRear(ch)
    stillEqual=True
    while chardeque.size()>1 and stillEqual:
        first=chardeque.removeFront()
        last=chardeque.removeRear()
        if first !=last:
            stillEqual=False
    return stillEqual

print(palchecker("lsdkjfskf"))
print(palchecker("toot"))

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/824086.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux - 进程控制(进程等待)

进程等待必要性 之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。 另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力&…

Activiti 深入理解:Activiti 流程引擎的 25 张数据库表都存储了什么?ing

1. Activiti 数据库表名说明(分类与说明) https://www.activiti.org/userguide/#database.tables.explained \qquad Activiti 的数据库表名称都以 ACT_ 开头,而第二部分是表 use case 的双字符标识,use case 也大致与 Activiti 服…

Vue3中使用事件总线Bus的两种方式(mitt)

首先咱们得先下载mitt指令如下: npm i mitt --save 接下来介绍Vue3中通过mitt使用事件总线的两种方式 方式一: 该方式为全局挂载mitt,个人感觉有点繁琐,不太推荐 创建: 1.首先找到你的main.js或main.ts文件 2.引入mitt 3.…

MIT 6.S081 Lab Nine --- file system

MIT 6.S081 Lab Nine --- file system 引言File systemLarge files(moderate)预备看什么你的工作代码解析 Symbolic links(moderate)硬链接代码解析 可选的挑战练习 引言 本文为 MIT 6.S081 2020 操作系统 实验九解析。 MIT 6.S081课程前置基础参考: 基于RISC-V搭建操作系统系…

pc文件上传

1.代码&#xff1a; <template><div><el-upload:multiple"true":auto-upload"true":headers"headers":action"uploadFileUrl":before-upload"handleBeforeUpload":on-error"handleUploadError":o…

MB21 手工创建261生产订单的预留

1、前面博文中有说到新增了工单超领的移动类型Z61,我们在创建新的移动类型的时候参考的是261的移动类型。本质上Z61的配置和261也是一样的。 2、我们在MB21创建预留的时候就会遇到问题 这里系统给出了提示:不能手工创建该类型的预留。 3、SE38对程序进行修改,根据报错的信…

BES IIR EQ音效设计原理

+我V hezkz17进数字音频系统研究开发交流答疑群(课题组) BES EQ音效集成流程 1 BES 音效调试工具 audiotool_v3.5 2 EQ音效参数生成 电声学工程师根据听音效果,生成参数,一般通过截图给的软件这边。 EQ参数四元组:{ IIR滤波器类型,Gain增益,f中心频率,Q品质因数 }

0801|IO进程线程day4【stat获取文件属性】

目录 1 获取文件属性 1&#xff09;stat 2&#xff09;提取文件的权限 3&#xff09;提取文件的类型 4&#xff09;提取文件所属用户名【getpwuid函数】 5&#xff09;提取文件所属组用户名【getgrgid函数】 6&#xff09;完整代码&#xff1a; 1 获取文件属性 1&#x…

error: #5: cannot open source input file “core_cmInstr.h“

GD32F103VET6和STM32F103VET6引脚兼容。 GD32F103VET6工程模板需要包含头文件&#xff1a;core_cmInstr.h和core_cmFunc.h&#xff0c;这个和STM32F103还是有区别的&#xff0c;否则会报错&#xff0c;如下&#xff1a; error: #5: cannot open source input file "core…

AI 3D结构光技术加持,小米引领智能门锁新标准

一直以来&#xff0c;小米智能门锁系列产品让更多家庭走进了安全便捷的智能生活&#xff0c;安全至上的设计让很多家庭都轻松告别了随身钥匙。 7月27日&#xff0c;小米正式推出小米智能门锁M20 Pro&#xff0c;再一次引领智能门锁产品的发展潮流。该款门锁采用AI 3D结构光技术…

算法竞赛入门【码蹄集新手村600题】(MT1080-1100)

算法竞赛入门【码蹄集新手村600题】(MT1080-1100&#xff09; 目录MT1081 xy的和MT1082 x-y的和MT1083 向下取整MT1084 k次方根MT1085 分期付款MT1086 公里转换为米MT1087 温度转换MT1088 温度对照MT1089 整理玩具MT1090 卡罗尔序列MT1091 合并||MT1092 非常大的NMT1093 序列MT…

C语言每日一题:10.不使用+-*/实现加法+找到所有数组中消失的数。

题目一&#xff1a; 题目链接&#xff1a; 思路一&#xff1a; 1.两个数二进制之间进行异或如果不产生进位操作那么两个数的和就是就是两个数进行异或的结果。 举例&#xff1a;5&#xff08;0101&#xff09;2&#xff08;0010&#xff09;进行异或等于&#xff1a;7&#xf…

Jmeter —— jmeter接口自动化测试操作流程

在企业使用jmeter开展实际的接口自动化测试工具&#xff0c;建议按如下操作流程&#xff0c; 可以使整个接口测试过程更规范&#xff0c;更有效。 接口自动化的流程&#xff1a; 1、获取到接口文档&#xff1a;swagger、word、excel ... 2、熟悉接口文档然后设计测试用例&am…

2023年华数杯建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; 最短时间生产计划模型 该模型出现在好几个竞赛赛题上&#x…

多人任务管理,如何做好任务管理,任务管理软件

任务管理&#xff0c;简单易懂&#xff0c;就是对任务进行管理。那怎么可以更好进行任务管理呢&#xff1f;怎么样样可以让任务进度可视化&#xff0c;一目了然呢&#xff1f;有效的管理可以让我们事半功倍。 接下来我们看一下如何借助任务管理软件高效的做任务管理。 首先创…

python dataframe a.combine_first(temp) # 一张表的缺失值用另一张表填充

将a的索引和temp的索引设置为一样&#xff0c;再进行缺失值填充&#xff0c;combine_first会对所有同名的column进行填充。 a.combine_first(temp)

2.04 商品搜索功能实现

根据关键字获取分类查询对应的分页商品信息&#xff0c;并可以价格和销量进行排序切换 步骤1&#xff1a;mapper.xml编写sql语句 <!-- k: 默认&#xff0c;代表默认排序&#xff0c;根据name--> <!-- c: 根据销量排序--> <!-- p: 根据价格排序--> <sel…

【C++基础(六)】类和对象(中) --拷贝构造,运算符重载

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C初阶之路⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 类和对象 1. 前言2. 拷贝构造函数2.1 对拷贝构造函数…

Approximating Wasserstein distances with PyTorch学习

https://github.com/dfdazac/wassdistance/tree/master 前置知识 Computational optimal transport学习 具体看到熵对偶的坐标上升那就行 L C ε ( a , b ) def. min ⁡ P ∈ U ( a , b ) ⟨ P , C ⟩ − ε H ( P ) \mathrm{L}_{\mathbf{C}}^{\varepsilon}(\mathbf{a}, \m…

Kafka系列之:记录一次Kafka Topic分区扩容,但是下游flink消费者没有自动消费新的分区的解决方法

Kafka系列之:记录一次Kafka Topic分区扩容,但是下游flink消费者没有自动消费新的分区的解决方法 一、背景二、解决方法三、实现自动发现新的分区一、背景 生产环境Kafka集群压力大,Topic读写压力大,消费的lag比较大,因此通过扩容Topic的分区,增大Topic的读写性能理论上下…