Python双端队列的3种实现及应用

概述

双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的线性数据结构。双端队列也拥有两端:队首(front)、队尾(rear),但与队列不同的是,插入操作在两端(队首和队尾)都可以进行,删除操作也一样。

双端队列的数据存储结构可以是顺序表,也可以是链表,即顺序双端队列和链双端队列。


图片.png

双端队列ADT(抽象数据类型)一般提供以下接口:

Deque() 创建双端队列
insert(item) 向队首插入项
append(item) 向队尾插入项
popFront() 返回队首的项,并从双端队列中删除该项
pop() 返回队尾的项,并从双端队列中删除该项
isEmpty() 判断双端队列是否为空
size() 返回双端队列中项的个数
get(index) 返回对列中的对象
show() 对象遍历

操作示意图:


图片.png

顺序双端队列

顺序双端队列是使用顺序表存储数据的双端队列,Python 中的列表元组都属于顺序表,下面使用列表来存储数据,实现顺序双端队列。

class SeQueue(object):def __init__(self):self.__members = list()def isEmpty(self):return not len(self.__members)def show(self):if self.isEmpty():returnfor member in self.__members:if self.__members.index(member) != len(self.__members) - 1:print(member, end=',')else:print(member)def insert(self, data):self.__members.insert(0, data)def append(self, data):self.__members.append(data)def popFront(self):if self.isEmpty():returnreturn self.__members.pop(0)def pop(self):if self.isEmpty():returnreturn self.__members.pop()def size(self):return len(self.__members)def check(self, index):if index < 0 or index > len(self.__members) - 1:raise IndexErrorreturn self.__members[index]
使用
if  name == ' main':
sdq = SeQueue()
print("isEmpty: ", sdq.isEmpty())
sdq.show()
sdq.insert('x')
sdq.insert('z')
sdq.append(10)
sdq.append(20)
sdq.show()
print(sdq.popFront())
print(sdq.pop())
sdq.show()
print("sequence double queue length: ", sdq.size())
print("index member is: ", sdq.check(2))

链双端队列的实现

链双端队列是使用链表存储数据的双端队列,链表是逻辑有序的,由一个一个的节点构成,所以先声明一个创建节点的类。

# coding=utf-8
class Node(object):"""链双端,节点对象类"""def __init__(self, data):self.data = dataself.next = Noneclass LinkQueue(object):"""链表"""def __init__(self):self.__head = Nonedef isEmpty(self):return not self.__headdef show(self):if self.isEmpty():returncur = self.__headwhile cur is not None:if cur.next is not None:print(cur.data, end=',')else:print(cur.data)cur = cur.nextdef insert(self, data):node = Node(data)node.next = self.__headself.__head = nodedef append(self, data):if self.isEmpty():self.insert(data)returnnode = Node(data)cur = self.__headwhile cur.next is not None:cur = cur.nextcur.next = nodedef popFront(self):if self.isEmpty():returncur = self.__headself.__head = self.__head.nextreturn cur.datadef pop(self):if self.isEmpty():returncur = self.__headprev = Nonewhile cur.next is not None:prev = curcur = cur.nextif cur == self.__head:self.__head = self.__head.nextreturnprev.next = cur.nextreturn cur.datadef size(self):size = 0cur = self.__headwhile cur is not None:size += 1cur = cur.nextreturn sizedef get(self, index):if index < 0 or index >= self.size():raise IndexErrorcur = self.__headfor _ in range(index):cur = cur.nextreturn cur.data

用标准库collections.deque实现

from collections import dequeclass Deque:def __init__(self):self.items = deque()def insert(self, item):self.items.appendleft(item)def append(self, item):self.items.append(item)def show(self):if self.isEmpty():returnfor index, value in enumerate(self.items):if index != len(self.items) - 1:print(self.items.__getitem__(index), end=',')else:print(self.items.__getitem__(index))def popFront(self):return self.items.popleft()def pop(self):return self.items.pop()def isEmpty(self):return self.size() == 0def size(self):return len(self.items)def get(self, index):self.items.__getitem__(index)

举例

ldq = Deque()# print("isEmpty: ", ldq.isEmpty())# ldq.show()ldq.insert('X')ldq.insert('Y')ldq.insert('Z')ldq.append(100)ldq.append(200)ldq.append(300)ldq.show()# print(ldq.popFront())# print(ldq.pop())# ldq.show()print("link queue length: ", ldq.size())print("index member is: ", ldq.get(2))

输出

Z,Y,X,100,200,300
link queue length:  6
index member is:  None

应用 - 回文算法

算法:回文(palindrome)是正读反读都一样的单词或句子,是一种修辞方式和文字游戏。
举例:

madam
able was i ere i saw elba
# 中文
花非花
人人为我、我为人人

如果要实现一个 回文验证算法(验证一个给定的字符串是否为回文),使用Deque类将非常容易:将字符串存储到双端队列,同时取出首尾字符并比较是否相等,只要有一对字符不等,则该字符串不是回文;若全部相等,则该字符串为回文。具体代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def palchecker(aString):chardeque = Deque()for ch in aString:chardeque.insert(ch)while chardeque.size() > 1:first = chardeque.popFront()last = chardeque.pop()if first != last:return Falsereturn Trueif __name__ == '__main__':str1 = 'able was i ere i saw elba'print('"%s" is%s palindrome' % (str1, '' if palchecker(str1) else ' not'))str2 = u'人人为我、我为人人'print(u'"%s"%s是回文' % (str2, u'' if palchecker(str2) else u'不'))str3 = u"What's wrong 怎么啦"print(u'"%s"%s是回文' % (str3, u'' if palchecker(str3) else u'不'))

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

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

相关文章

【pytorch学习】 深度学习 教程 and 实战

pytorch编程实战博主&#xff1a;https://github.com/lucidrains https://github.com/lucidrains/vit-pytorch

从0到1入门C++编程——04 类和对象之封装、构造函数、析构函数、this指针、友元

文章目录 一、封装二、项目文件拆分三、构造函数和析构函数1.构造函数的分类及调用2.拷贝函数调用时机3.构造函数调用规则4.深拷贝与浅拷贝5.初始化列表6.类对象作为类成员7.静态成员 四、C对象模型和this指针1.类的对象大小计算2.this指针3.空指针访问成员函数4.const修饰成员…

C#,入门教程(08)——基本数据类型及使用的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(07)——软件项目的源文件与目录结构https://blog.csdn.net/beijinghorn/article/details/124139947 数据类型用于指定数据体&#xff08;DataEntity&#xff0c;包括但不限于类或结构体的属性、变量、常量、函数返回值&#xff09;…

16、Kubernetes核心技术 - 节点选择器、亲和和反亲和

目录 一、概述 二、节点名称 - nodeName 二、节点选择器 - nodeSelector 三、节点亲和性和反亲和性 3.1、亲和性和反亲和性 3.2、节点硬亲和性 3.3、节点软亲和性 3.4、节点反亲和性 3.5、注意点 四、Pod亲和性和反亲和性 4.1、亲和性和反亲和性 4.2、Pod亲和性/反…

stable diffusion 进阶教程-controlnet详解(持续更新中)

说明 插件下载链接:https://pan.baidu.com/s/1-qmJzqcB72nTv_2QLmR-gA?pwd=8888 提取码: 8888 讨论Q群:830970289 个人微信:mindcarver 如果在按着教程尝试的过程中有错误或问题,可以上面询问讨论,或者评论区留言 如果教程有什么问题,请帮忙纠正,持续更新(部分控制插件…

Android开发编程从入门到精通,安卓技术从初级到高级全套教学

一、教程描述 本套教程基于JDK1.8版本&#xff0c;教学内容主要有&#xff0c;1、环境搭建&#xff0c;UI布局&#xff0c;基础UI组件&#xff0c;高级UI组件&#xff0c;通知&#xff0c;自定义组件&#xff0c;样式主题&#xff1b;2、四大组件&#xff0c;Intent&#xff0…

数据库的连接

连接数据库 我们使用WinR输入cmd打开运行窗口 输入:sqlplus并回车 输入用户名和密码,我用的是Scott,密码我自己设置的123456,Scott默认的密码是tiger,回车 这种情况表示登录成功 在连接Scott成功的情况下创建一些数据,在我的资源里面有个Oracle数据基础可以下载,直接复制粘…

详解Java中的原子操作

第1章&#xff1a;什么是原子操作 大家好&#xff0c;我是小黑&#xff0c;面试中一个经常被提起的话题就是“原子操作”。那么&#xff0c;到底什么是原子操作呢&#xff1f;在编程里&#xff0c;当咱们谈论“原子操作”时&#xff0c;其实是指那些在执行过程中不会被线程调度…

59.网游逆向分析与插件开发-游戏增加自动化助手接口-文字资源读取类的C++还原

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;游戏菜单文字资源读取的逆向分析-CSDN博客 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;55358fb135a0c821d8e8…

AI实景无人直播创业项目:开启自动直播新时代,一部手机即可实现增长

在当今社会&#xff0c;直播已经成为了人们日常生活中不可或缺的一部分。无论是商家推广产品、明星互动粉丝还是普通人分享生活&#xff0c;直播已经渗透到了各行各业。然而&#xff0c;传统直播方式存在着一些不足之处&#xff0c;如需现场主持人操作、高昂的费用等。近年来&a…

C++多态性——(5)运算符重载(第二节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 身先才能率人&#xff0c;律己才能服人…

Windows重装升级Win11系统后 恢复Mysql数据

背景 因为之前电脑硬盘出现问题&#xff0c;换了盘重装了系统&#xff0c;项目的数据库全部没了&#xff0c;还好之前的Mysql是安装在的D盘里&#xff0c;还有留存文件 解决办法 1.设置环境变量 我的路径是 D:\SoftWare\Application\mysql-5.7.35-winx64 此电脑右键属性 …

简单 Web Server 程序的设计与实现 (2024)

1.题目描述 Web 服务是 Internet 最方便与受用户欢迎的服务类型&#xff0c;它的影响力也远远超出了专业技术范畴&#xff0c; 已广泛应用于电子商务、远程教育、远程医疗与信息服务等领域&#xff0c;并且有继续扩大的趋势。目前很多 的 Internet 应用都是基于 Web 技术的&…

MySQL5.7 InnoDB 内存结构

官网地址&#xff1a;MySQL :: MySQL 5.7 Reference Manual :: 14.5 InnoDB In-Memory Structures 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. MySQL 5.7 参考手册 / ... / 缓冲池 14.5.1 缓冲池 缓冲池是…

MySQL数据库进阶-事务

事务 事务由单独单元的一个或多个SQL语句组成&#xff0c;在这 个单元中&#xff0c;每个MySQL语句是相互依赖的。而整个单独单 元作为一个不可分割的整体&#xff0c;如果单元中某条SQL语句一 旦执行失败或产生错误&#xff0c;整个单元将会回滚。所有受到影 响的数据将返回到…

利用MATLAB绘制折线图

介绍 Matlab画图线型、符号及颜色汇总&#xff1a; https://blog.csdn.net/qq_40969467/article/details/90758281 实例&#xff1a; x20:20:140;%x轴上的数据&#xff0c;第一个值代表数据开始&#xff0c;第二个值代表间隔&#xff0c;第三个值代表终止a[0.85, 2.2, 3.45,…

高校选课系统需求分析开发源码

高校学生选课报名系统包括学生、教师和管理员三方的功能需求&#xff0c;学生的需求是查询院系的课程、选课情况及个人信息修改&#xff1b;教师则需要查看和查询所有课程信息及自己的课程信息以及教师信息的修改&#xff1b;管理员则负责更为复杂的任务&#xff0c;包括对学生…

解决 POST http://x.x.x.x:8000/aaa/ net::ERR_CONNECTION_TIMED_OUT

记录一下我遇到的问题和解决办法 我的项目前后端分离&#xff0c;在前端用的vue访问后端时连接不上后端&#xff0c;一切操作都触发不了后端&#xff0c;数据也传不到后端去&#xff1b; 原因&#xff1a;url有问题&#xff0c;url地址写的不是本机&#xff0c;所以导致连接超…

FA2016AA (MHz范围晶体单元超小型低轮廓贴片) 汽车

随着科技的不断发展&#xff0c;智能汽车逐渐成为人们出行的首选。而其中&#xff0c;频率范围在19.2 MHz ~ 54 MHz的晶体单元超小型低轮廓贴片&#xff08;FA2016AA&#xff09;为汽车打造更智能、更舒适、更安全的出行体验。FA2016AA贴片的外形尺寸为2.0 1.6 0.5 mm&#x…

原生JS调用OpenAI GPT接口并实现ChatGPT逐字输出效果

效果&#xff1a; 猜你感兴趣&#xff1a;springbootvue实现ChatGPT逐字输出打字效果 附源码&#xff0c;也是小弟原创&#xff0c;感谢支持&#xff01; 没废话&#xff0c;上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><me…