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越高的搜索词就说明该搜索词热度越高。…

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…

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。 硬件实物 节点板子上带有继电器…

Hosts File Editor 实用工具

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

◢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 。 …

海康威视(iVMS)综合安防系统任意文件上传漏洞复现 [附POC]

文章目录 海康威视&#xff08;iVMS&#xff09;综合安防系统任意文件上传漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 海康威视&#xff08;iVMS&#xff09;综合安防系统任意文件上传漏洞复…

[PyTorch][chapter 62][强化学习-基本概念]

前言&#xff1a; 目录&#xff1a; 强化学习概念 马尔科夫决策 Bellman 方程 格子世界例子 一 强化学习 强化学习 必须在尝试之后&#xff0c;才能发现哪些行为会导致奖励的最大化。 当前的行为可能不仅仅会影响即时奖赏&#xff0c;还有影响下一步奖赏和所有奖赏 强…

使用Inis搭配内网穿透实现Ubuntu上快速搭建博客网站远程访问

文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总…

在 uniapp 中 一键转换单位 (px 转 rpx)

在 uniapp 中 一键转换单位 px 转 rpx Uni-app 官方转换位置利用【px2rpx】插件Ctrl S一键全部转换下载插件修改插件 Uni-app 官方转换位置 首先在App.vue中输入这个&#xff1a; uni.getSystemInfo({success(res) {console.log("屏幕宽度", res.screenWidth) //屏…

酷柚易汛ERP - 商品库存余额表操作指南

1、应用场景 商品库存余额表用于查询商品在各仓库的实际结存量、单位成本以及成本等明细。 2、主要操作 打开【仓库】-【商品库存余额表】&#xff0c;可筛选仓库、商品、商品类别&#xff0c;导出/打印等操作见【销货单】不再赘述。 3、分享操作 库存余额分享&#xff0c;…

CCLink转Modbus TCP网关_MODBUS网口设置

兴达易控CCLink转Modbus TCP网关是一种用于连接CCLink网络和Modbus TCP网络的设备。它提供了简单易用的MODBUS网口设置&#xff0c;可以帮助用户轻松地配置和管理网络连接 1 、网关做为MODBUS主站 &#xff08;1&#xff09;将电脑用网线连接至网关的P3网口上。 &#xff08;…

计算机网络(一)

一、什么是计算机网络、计算机协议&#xff1f; 计算机网络就是由计算机作为收发端&#xff0c;不同计算机相互连接的网络&#xff0c;包括互联网&#xff08;Internet&#xff09;&#xff0c;公司或者家用网络&#xff08;intranet&#xff09;等等&#xff1b;其中Internet…

【C语言 | 指针】C指针详解(经典,非常详细)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…