python双端队列_中间是头两边是尾_两边是头中间是尾

双端队列的顺序表存储结构以及两种特殊的双端队列

双端队列 是一种允许我们同时从前端和后端添加和删除元素的特殊队列,它是队列和栈的结合体。

双端队列(deque)与队列(queue)就差了两个字,队列里元素只能从头部出来,尾部进去,双端队列也有前端和后端,只不过前后端都能进出数据,元素从哪一端进去或者出来并不是固定的。新的元素可以从头部也可以从尾部进去,已有的元素也可以从头部或者尾部出来。

现实生活中也有应用双端队列的例子:例如我们去电影院排队买票。一个刚刚买完票的人想回来咨询下简单信息,就可以直接回到队伍的头部。某些人正在队尾排队,如果比较赶时间,改变看电影的计划了,就可以从队尾直接离开队伍。

计算机科学中,双端队列常见的应用是存储一系列的撤销操作时。每当用户进行一个操作,操作就会被存,可以撤回到上一步的操作的节点。

 以列表为基础的普通双端队列:

class Deque:"""先进先出"""def __init__(self):self.list=[]def is_empty(self):return self.list is []def push_front(self,data):"""往队首添加一个元素"""self.list.insert(0,data)def push_rear(self,data):"""往队尾添加元素"""self.list.append(data)def pop_front(self):"""弹出队头元素"""return self.list.pop(0)def pop_rear(self):"""弹出队尾元素"""return self.list.pop()def getfront(self):"""获知队头元素"""return self.list[0]def size(self):return len(self.list)

 双端队列不仅仅可以两边都可以进队出队,也可以中间是头两边是尾,或者两边是头中间是尾。

"两边是头中间是尾"的双端队列是一种特殊的数据结构,它的特点是可以在队列的两端进行插入和删除操作,而队列的中间部分保持不变。这种数据结构在实际应用中可能并不常见,但可以根据具体的需求进行实现。

在这种双端队列中,头部和尾部都可以进行插入和删除操作,而队列的中间部分则保持不变。这样的设计可能在某些特定的场景下有用,比如需要保持队列中间部分的顺序不变,而只在两端进行操作。实现这样的双端队列可能需要考虑如何确保中间部分的稳定性,以及如何进行高效的插入和删除操作。具体的实现方式可能需要根据具体的需求和场景来进行设计和优化。

两边是头中间是尾的双端队列:

#两边是头,中间是尾的从两端往中间走的双端队列
class Deque(object):def __init__(self, size):self.list1 = [None for i in range(size)]self.size = sizeself.zuotou = 0  #尾在抽象层面上的初始位置在头的后一位self.zuowei = -1self.youtou = size-1self.youwei = sizedef empty(self):if self.zuotou-1==self.zuowei and self.youtou+1==self.youwei: #判断条件:两边的尾巴都在头的后一位return Trueelse:return Falsedef full(self):if self.zuowei + 1 == self.youwei:  #判断条件:两个尾巴相邻return Trueelse:return Falsedef push(self, flag, data):             #flag用来确立往左右哪边队列添加元素if self.full():print('无法再添加数据,队列满')else:if flag == 1:self.zuowei += 1      #尾巴后移,然后赋值self.list1[self.zuowei] = dataelse:self.youwei -= 1      #抽象层面上尾巴后移,然后赋值self.list1[self.youwei] = datadef pop(self, flag):if self.empty():return Falseelse:if flag == 1:self.list1[self.zuotou]=None  #让头赋值为None,再指向下一个头self.zuotou+=1else:self.list1[self.youtou]=None  #让头赋值为None,再指向下一个头self.youtou-=1
SS=Deque(10)
print("空",SS.empty())
print("满",SS.full())
print(SS.list1)
SS.push(1, 12)
SS.push(2, 90)
print(SS.list1)
SS.push(1, 13)
SS.push(2, 89)
print(SS.list1)
SS.pop(2)
print(SS.list1)
print("空",SS.empty())
SS.pop(1)
print(SS.list1)
print("空",SS.empty())
SS.push(1,0)
SS.push(1,1)
SS.push(1,2)
SS.push(1,3)
SS.push(1,4)
SS.push(1,5)
print(SS.list1)
print("满",SS.full())
SS.push(1,6)# 空 True
# 满 False
# [None, None, None, None, None, None, None, None, None, None]
# [12, None, None, None, None, None, None, None, None, 90]
# [12, 13, None, None, None, None, None, None, 89, 90]
# [12, 13, None, None, None, None, None, None, 89, None]
# 空 False
# [None, 13, None, None, None, None, None, None, 89, None]
# 空 False
# [None, 13, 0, 1, 2, 3, 4, 5, 89, None]
# 满 True
# 无法再添加数据,栈满
#
# Process finished with exit code 0

 中间是头两边是尾的双端队列可以被理解为一个具有双向操作的队列,可以在队列的两端进行插入和删除操作。这种数据结构在很多应用中都非常有用,例如在实现双向搜索算法、滑动窗口等场景中都可以发挥作用。

中间是头两边是尾的双端队列:

# 中间是头,两边是尾的从两端往两边走的双端队列
class Deque(object):def __init__(self, size):self.list1 = [None for i in range(size)]self.size = sizeself.middle=(size+1)//2   #用该方法确定size是奇数和偶数两种情况时中间头部位置的选取self.zuotou = self.middle-1self.zuowei = self.middle   #尾巴在抽象层面初始时在头的后一位self.youtou = self.middleself.youwei = self.middle-1def empty(self):if self.zuotou+1==self.zuowei and self.youtou-1==self.youwei :#判断条件:两边的尾巴都在头的后一位return Trueelse:return Falsedef full(self):    #判断条件:左边的尾巴到左头,或者右边的尾巴到右头if self.zuowei==0 or self.youwei==self.size-1:return Trueelse:return Falsedef push(self, flag, data):             #flag用来确立往左右哪个队列添加元素if self.full():print('无法再添加数据,队列满')else:if flag == 1:self.zuowei -= 1        #尾巴移动,赋值self.list1[self.zuowei] = dataelse:self.youwei += 1         #尾巴移动,赋值self.list1[self.youwei] = datadef pop(self, flag):if self.empty():return Falseelse:if flag == 1:self.list1[self.zuotou]=None  #头赋值None,再移动self.zuotou-=1else:self.list1[self.youtou]=None  #头赋值None,再移动self.youtou+=1
SS=Deque(10)
print("空",SS.empty())
print("满",SS.full())
print(SS.list1)
SS.push(1, 12)
SS.push(2, 90)
print(SS.list1)
SS.push(1, 13)
SS.push(2, 89)
print(SS.list1)
SS.pop(2)
print(SS.list1)
print("空",SS.empty())
SS.pop(1)
print(SS.list1)
print("空",SS.empty())
SS.push(1,0)
SS.push(1,1)
SS.push(1,2)
SS.push(1,3)
print(SS.list1)# 空 True
# 满 False
# [None, None, None, None, None, None, None, None, None, None]
# [None, None, None, None, 12, 90, None, None, None, None]
# [None, None, None, 13, 12, 90, 89, None, None, None]
# [None, None, None, 13, 12, None, 89, None, None, None]
# 空 False
# [None, None, None, 13, None, None, 89, None, None, None]
# 空 False
# 无法再添加数据,队列满
# [2, 1, 0, 13, None, None, 89, None, None, None]
#
# Process finished with exit code 0

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

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

相关文章

使用Redis实现热搜功能

Redis热搜 原理数据类型redis操作简单实现 实操封装方法执行方法最后使用springboot的定时任务对热搜榜单进行维护 原理 使用redis实现热搜的原理就是维护一个zset集合,然后使用score作为当前搜索词的搜索量,score越高的搜索词就说明该搜索词热度越高。…

深入理解IO和NIO的原理和区别

在计算机编程领域,IO(Input/Output)和NIO(Non-blocking Input/Output)代表了两种截然不同的输入输出模型,它们在数据输入和输出方面采用不同的理念和机制。本文将深入剖析IO和NIO的原理,以及它们…

css实战——清除列表中最后一个元素的下边距

需求描述 常见于列表的排版&#xff0c;如文章列表、用户列表、商品列表等。 代码实现 <div class"listBox"><div class"itemBox">文章1</div><div class"itemBox">文章2</div><div class"itemBox"…

SSM框架Demo: 简朴博客系统

文章目录 1. 前端页面效果2. 项目创建3. 前期配置3.1. 创建数据库数据表3.2. 配置文件 4. 创建实体类5. 统一处理5.1. 统一返回格式处理5.2. 统一异常处理 6. 全局变量7. Session工具类8. 登录拦截器9. 密码加盐加密10. 线程池组件11. dao层11.1. UserMapper11.2. ArticleMappe…

聊聊本地缓存神器:Caffeine

目录 Caffeine基本介绍 简单使用 清除策略 GuavaCache和Caffeine差异 Caffeine基本介绍 Caffeine 是基于 JAVA 8 的高性能本地缓存库。并且在 spring5 (springboot 2.x) 后&#xff0c;spring 官方放弃了 Guava&#xff0c;而使用了性能更优秀的 Caffeine 作为默认缓存组…

nodejs express vue uniapp电影购票系统源码

开发技术&#xff1a; node.js&#xff0c;vscode&#xff0c;HBuilder X express vue elementui uniapp 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示搜索电影&#xff0c;轮播图&#xff0c;电影分类&#xff0c;最近上架电影 点击电影进入电影详情&am…

数据结构线性表——栈

前言&#xff1a;哈喽小伙伴们&#xff0c;今天我们将一起进入数据结构线性表的第四篇章——栈的讲解&#xff0c;栈还是比较简单的哦&#xff0c;跟紧博主的思路&#xff0c;不要掉队哦。 目录 一.什么是栈 二.如何实现栈 三.栈的实现 栈的初始化 四.栈的操作 1.数据入栈…

Apache Druid连接回收引发的血案

问题 线上执行大批量定时任务&#xff0c;发现SQL执行失败的报错&#xff1a; CommunicationsException, druid version 1.1.10, jdbcUrl : jdbc:mysql://xxx?useUnicodetrue&characterEncodingUTF-8&zeroDateTimeBehaviorconvertToNull,testWhileIdle true, idle …

Zigbee智能家居方案设计

背景 目前智能家居物联网中最流行的三种通信协议&#xff0c;Zigbee、WiFi以及BLE&#xff08;蓝牙&#xff09;。这三种协议各有各的优势和劣势。本方案基于CC2530芯片来设计&#xff0c;CC2530是TI的Zigbee芯片。 网关使用了ESP8266CC2530。 硬件实物 节点板子上带有继电器…

flink对状态ttl进行单元测试

背景 在处理键值分区状态时&#xff0c;使用ttl设置过期时间是我们经常使用的&#xff0c;但是任何代码的修改都需要首先进行单元测试&#xff0c;本文就使用单元测试来验证一下状态ttl的设置是否正确 测试状态ttl超时的单元测试 首先看一下处理函数&#xff1a; // 处理函…

Hosts File Editor 实用工具

我一般手工编辑hosts文件&#xff0c;我想给hosts文件加一个开关&#xff0c;本想自己实现&#xff0c;但是忽然发现微软已经提供了官方的解决方案&#xff0c;感觉有能人。 对文件的行的修改被抽象成了一个开关。腻害&#xff01;&#xff01;&#xff01;

SpringBoot3-快速入门

1.前置知识 Java17Spring、SpringMVC、MyBatisMaven、IDEA\ 2. 环境要求 环境&工具 版本&#xff08;or later&#xff09; SpringBoot 3.0.5 IDEA 2021.2.1 Java 17 Maven 3.5 Tomcat 10.0 Servlet 5.0 GraalVM Community 22.3 Native Build Tools 0.9…

◢Django 自写分页与使用

目录 1、设置分页样式,并展示到浏览器 2、模拟页码 3、生成分页 4、数据显示 5、上一页下一页 6、数据库的数据分页 7、封装分页 8、使用封装好的分页 建立好app后&#xff0c;设置路径path(in2/,views.in2)&#xff0c;视图def in2(request): &#xff0c;HTML: in2.html…

RK3568笔记五:基于Yolov5的训练及部署

若该文为原创文章&#xff0c;转载请注明原文出处。 一. 部署概述 环境&#xff1a;Ubuntu20.04、python3.8 芯片&#xff1a;RK3568 芯片系统&#xff1a;buildroot 开发板&#xff1a;ATK-DLRK3568 开发主要参考文档&#xff1a;《Rockchip_Quick_Start_RKNN_Toolkit2_C…

开源知识库软件xwiki在Windows下的安装

文章目录 开源知识库软件-xwiki在windows上的部署0、参考文档1、前置环境准备1.1、Windows版本及系统配置1.2、JDK11安装1.3、Tomcat9安装1.4、MySQL5.7数据库的安装 2、xwiki安装3、配置3.1、修改配置支持对文档内容进行搜索 4、问题解决4.1、附件无法上传问题4.1、附件无法下…

FreeRTOS知识梳理

一、RTOS:Real time operating system,中文意思为 实时操作系统&#xff0c;它是一类操作系统&#xff0c;比如uc/OS、FreeRTOS、RTX、RT-Thread 这些都是实时操作系统。 二、移植FreeRTOS到STM32F103C8T6上 interface选择CMSIS_V1,RCC选择Crystal Ceramic Resonator 。 …

5. 深度学习——正则化

机器学习面试题汇总与解析——正则化 本章讲解知识点 什么是正则化为什么要使用正则化?详细讲解正则化本专栏适合于Python已经入门的学生或人士,有一定的编程基础。本专栏适合于算法工程师、机器学习、图像处理求职的学生或人士。本专栏针对面试题答案进行了优化,尽量做到好…

C#中匿名类的声明及使用

C#中声明方法或类时&#xff0c;可以不指定的类或方法的名字&#xff0c;也就是匿名类和匿名的方法。以下主要介绍C#中匿名类的声明及使用。 1、匿名类的使用 匿名类是C# 3.0/.NET 3.x中新增特性&#xff0c;在匿名类的语法中并没有为其命名&#xff0c;而是直接使用new { }方…

无感刷新token

无感刷新 无感刷新Token技术是一种用于实现持久登录体验的关键技术&#xff0c;它通过在用户登录后自动刷新Token&#xff0c;以延长用户的登录状态&#xff0c;避免频繁要求用户重新登录。 实现 使用access_token&#xff08;短效token&#xff09;和refresh_token&#xf…

CSS精灵图:提高网站性能的秘密武器

在网站开发中&#xff0c;页面加载速度是一个非常重要的指标。而CSS精灵图正是一种可以帮助提高网站性能的技术。它可以将多个小图标合并成一个大图&#xff0c;从而减少HTTP请求次数&#xff0c;提高页面加载速度。本篇博文将为你详细介绍CSS精灵图的概念、优势以及实现方式。…