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

news2024/11/20 10:29:39

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

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

双端队列(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 = size
        self.zuotou = 0  #尾在抽象层面上的初始位置在头的后一位
        self.zuowei = -1
        self.youtou = size-1
        self.youwei = size
    def empty(self):
        if self.zuotou-1==self.zuowei and self.youtou+1==self.youwei: #判断条件:两边的尾巴都在头的后一位
            return True
        else:
            return False
    def full(self):
        if self.zuowei + 1 == self.youwei:  #判断条件:两个尾巴相邻
            return True
        else:
            return False
    def push(self, flag, data):             #flag用来确立往左右哪边队列添加元素
        if self.full():
            print('无法再添加数据,队列满')
        else:
            if flag == 1:
                self.zuowei += 1      #尾巴后移,然后赋值
                self.list1[self.zuowei] = data
            else:
                self.youwei -= 1      #抽象层面上尾巴后移,然后赋值
                self.list1[self.youwei] = data
    def pop(self, flag):
        if self.empty():
            return False
        else:
            if flag == 1:
                self.list1[self.zuotou]=None  #让头赋值为None,再指向下一个头
                self.zuotou+=1
            else:
                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 = size
        self.middle=(size+1)//2   #用该方法确定size是奇数和偶数两种情况时中间头部位置的选取
        self.zuotou = self.middle-1
        self.zuowei = self.middle   #尾巴在抽象层面初始时在头的后一位
        self.youtou = self.middle
        self.youwei = self.middle-1
    def empty(self):
        if self.zuotou+1==self.zuowei and self.youtou-1==self.youwei :#判断条件:两边的尾巴都在头的后一位
            return True
        else:
            return False
    def full(self):    #判断条件:左边的尾巴到左头,或者右边的尾巴到右头
        if self.zuowei==0 or self.youwei==self.size-1:
            return True
        else:
            return False
    def push(self, flag, data):             #flag用来确立往左右哪个队列添加元素
        if self.full():
            print('无法再添加数据,队列满')
        else:
            if flag == 1:
                self.zuowei -= 1        #尾巴移动,赋值
                self.list1[self.zuowei] = data
            else:
                self.youwei += 1         #尾巴移动,赋值
                self.list1[self.youwei] = data
    def pop(self, flag):
        if self.empty():
            return False
        else:
            if flag == 1:
                self.list1[self.zuotou]=None  #头赋值None,再移动
                self.zuotou-=1
            else:
                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.coloradmin.cn/o/1204092.html

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

相关文章

uniapp——项目day04

购物车页面——商品列表区域 渲染购物车商品列表的标题区域 1. 定义如下的 UI 结构: 2.美化样式 渲染商品列表区域的基本结构 1. 通过 mapState 辅助函数,将 Store 中的 cart 数组映射到当前页面中使用: import badgeMix from /mixins/tab…

2023年【建筑电工(建筑特殊工种)】找解析及建筑电工(建筑特殊工种)复审考试

题库来源:安全生产模拟考试一点通公众号小程序 建筑电工(建筑特殊工种)找解析是安全生产模拟考试一点通生成的,建筑电工(建筑特殊工种)证模拟考试题库是根据建筑电工(建筑特殊工种)最新版教材汇编出建筑电工(建筑特殊工种)仿真模拟考试。2023年【建筑电…

1 Supervised Machine Learning Regression and Classification

文章目录 Week1OverViewSupervised LearningUnsupervised LearningLinear Regression ModelCost functionGradient Descent Week2Muliple FeatureVectorizationGradient Descent for Multiple RegressionFeature ScalingGradient DescentFeature EngineeringPolynomial Regress…

数据结构线性表——栈

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

CTFhub-RCE-读取源代码

源代码&#xff1a; <?php error_reporting(E_ALL); if (isset($_GET[file])) { if ( substr($_GET["file"], 0, 6) "php://" ) { include($_GET["file"]); } else { echo "Hacker!!!"; } } else {…

重磅!2024QS亚洲大学排名出炉!北大蝉联榜首,港大反超新国立、清华!

2023年11月8日&#xff0c;全球高等教育分析机构QS Quacquarelli Symonds发布了2024年QS世界大学排名&#xff1a;亚洲大学排名。 本次排名全方位评估了来自亚洲25个国家和地区的856所大学在全球认可度、研究实力、教学资源和国际化等方面的表现&#xff0c;有148所院校首次跻…

绝望了,软件测试的行业基本盘,崩了......

不得不承认&#xff0c;现在工作不好找 去年很多人都觉得今年的就业环境会好很多&#xff0c;但是到了现在都发现之前想错了&#xff0c;实际上是一塌糊涂… 于是有了很多年轻人焦虑日常的灵魂一问&#xff1a;“快半年了&#xff0c;找不到工作&#xff0c;我好焦虑&#xf…

Git的GUI图形化工具ssh协议IDEA集成Git

一、GIT的GUI图形化工具 1、介绍 Git自带的GUI工具&#xff0c;主界面中各个按钮的意思基本与界面文字一致&#xff0c;与git的命令差别不大。在了解自己所做的操作情况下&#xff0c;各个功能点开看下就知道是怎么操作的。即使不了解&#xff0c;只要不做push操作&#xff0c…

LeetCode-剑指 Offer 22. 链表中倒数第k个节点(C语言 )

目录捏 一、题目描述二、示例与提示三、思路四、代码 一、题目描述 给定一个头节点为 head 的链表用于记录一系列核心肌群训练项目编号&#xff0c;请查找并返回倒数第 cnt 个训练项目编号。 二、示例与提示 示例 1&#xff1a; 输入&#xff1a; head [2,4,7,8], cnt 1 输…

Linux 源码包安装

SRPM 包&#xff0c;比 RPM 包多了一个“S”&#xff0c;是“Source”的首字母&#xff0c;所以 SRPM 可直译为“源代码形式的 RPM 包”。也就是说&#xff0c;SRPM 包中不再是经过编译的二进制文件&#xff0c;都是源代码文件。可以这样理解&#xff0c;SRPM 包是软件以源码形…

新生儿母乳过敏:原因、科普和注意事项

引言&#xff1a; 母乳过敏是一种较为罕见但可能令家长担忧的现象。母亲通常认为母乳是新生儿最安全、最适合的食物&#xff0c;然而有时候宝宝可能对母乳中的某些成分产生过敏反应。本文将科普新生儿母乳过敏的原因&#xff0c;提供相关信息&#xff0c;并为父母和监护人提供…

轻量封装WebGPU渲染系统示例<27>- 浮点RTT纹理(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/FloatRTT.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下: const floatRTT { diffuse: { uuid: "rtt0", rttTe…

SPC on-line 应用探讨

中国是制造业大国&#xff0c;大部分工厂主要重点是将原料经由加工制造过程&#xff08;或流程&#xff09;转变为最终可销售的产品或服务。”产品”是经过被定义的规格下&#xff08;定义规格者包含客户、制造商本身、供应商…等&#xff09;&#xff0c;在经过”受控制”的人…

Linux C 进程编程

进程编程 进程介绍进程的定义进程和线程以及程序的区别进程块PCB进程的状态相关指令 进程调度算法先来先服务调度算法 FCFS短作业(进程)优先调度算法 SJF优先权调度算法 FPF优先权调度算法的类型非抢占式优先权算法抢占式优先权算法 优先权类型静态优先权动态优先权 高响应比优…

RT-DETR算法优化改进:Backbone改进 | HGBlock完美结合PPHGNetV2 GhostConv

💡💡💡本文独家改进: GhostConv助力RT-DETR ,HGBlock与PPHGNetV2 GhostConv完美结合 推荐指数:五星 HGBlock_GhostConv | 亲测在多个数据集能够实现涨点 RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/category_12497375.html ✨✨✨魔改创新RT-…

202311.13 windows通过vscode ssh远程连接到Ubuntu 连接失败 waiting for server log

关闭VScode时没有关闭终端的Ubuntu进程&#xff1f; 导致重启后不能正常连接到Ubuntu了 Windows 系统自带的cmd终端通过ssh 可以连接 应该是vscode里对Ubuntu 的服务器端配置出了问题 参考&#xff1a;记录 VSCode ssh 连接远程服务器时出错及解决方法 在Windows 的vscode里面执…

jumpserver任意密码重置漏洞-CVE-2023-42820

目录 jumpserver 环境搭建 这里用的是vulhub靶场 进入 jumpserver 的目录 修改配置文件 config.env 里面的 DOMAINS 参数为kali的地址 运行环境&#xff0c;第一次运行的话会拉取文件&#xff0c;要耐心等待。 命令&#xff1a; 查看docker容器 命令&#xff1a; 用浏…

【兔子王赠书第7期】机器学习与人工智能实战:基于业务场景的工程应用

文章目录 写在前面机器学习推荐图书写给读者前言本书面向的读者我为什么要写这本书运行本书的示例代码本书导航本书采用的约定使用代码示例 推荐理由粉丝福利写在后面 写在前面 新的一周开始啦&#xff0c;本周博主给大家带来《机器学习与人工智能实战&#xff1a;基于业务场景…

C语言ZZULIOJ1149:组合三位数之二

题目描述 把1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&#xff0c;8&#xff0c;9&#xff0c;组成三个三位数&#xff08;每个数只能用一次&#xff09;,第二个数是第一个数的2倍&#xff0c;第三个数是第一个数的3倍&#xff0c;这三…