【人生苦短,我学 Python】(13)通过python内置函数实现栈、队列


Python 所有文章传送门
【Python】所有文章传送门

目录

  • 简述 / 前言
  • 1. collections 的 `deque` 对象
  • 2. 栈
    • 2.1 栈操作-1
    • 2.2 栈操作-2
  • 3. 队列
    • 3.1 队列操作-1
    • 3.2 队列操作-2
  • 总结

简述 / 前言

上篇文章讲完了函数部分,这篇文章主要介绍如果通过内置函数(模块)实现常用的数据结构:队列

1. collections 的 deque 对象

collections.deque() 实现的是双端队列,它支持从任意一端增加和删除元素

操作含义
dq.append(x)在右端添加元素x
dq.appendleft(x)在左端添加元素x
dq.pop()从右端弹出元素。若队列中无元素,则导致IndexError
dq.popleft()从左端弹出元素。若队列中无元素,则导致IndexError
dq.extend(iterable)在右端添加系列iterable中的元素
dq.extendleft(iterable)在左端添加系列iterable中的元素
dq.remove(value)移除第一个找到的x。若未找到,则导致IndexError
dq.count(x)返回元素x在队列中出现的个数
dq.clear()删除所有元素,即清空队列
dq.reverse ()反转队列中所有元素
dq.rotate(n)如果n>0,所有元素向右移动n个位置(循环);否则向左

2. 栈

后进先出的结构,用双端队列实现。

2.1 栈操作-1

入栈使用 dq.append(x) 操作,出栈使用 dq.pop() 操作!

实现代码如下:

from collections import dequedq = deque()
dq.append(1)
dq.append(2)
dq.append(3)
dq.append(4)
dq.append(5)print(dq.pop())
print(dq.pop())
print(dq.pop())
print(dq.pop())
print(dq.pop())
print(dq.pop())     # 栈为空,引出IndexError

其输出如下:

5
4
3
2
1
Traceback (most recent call last):File "D:\xxxxxx\CSDN.py", line 15, in <module>print(dq.pop())     # 栈为空,引出IndexError
IndexError: pop from an empty deque

为了解决这个问题,我对 pop() 操作进行了修改,修改后的代码如下:

from collections import dequedef deque_pop(dq: deque) -> deque:"""重新实现出栈操作:param dq: 栈:return: 出栈后的栈"""if len(dq) == 0:return deque()else:return dq.pop()dq = deque()
dq.append(1)
dq.append(2)
dq.append(3)
dq.append(4)
dq.append(5)print(deque_pop(dq))
print(deque_pop(dq))
print(deque_pop(dq))
print(deque_pop(dq))
print(deque_pop(dq))
print(deque_pop(dq))    # 栈为空

其输出如下:

5
4
3
2
1
deque([])

2.2 栈操作-2

因为我们是用双端队列实现的栈,因此还可以换个方向当做栈顶,入栈使用 dq.appendleft(x) 操作,出栈使用 dq.popleft() 操作!

实现代码如下:

from collections import dequedq = deque()
dq.appendleft(1)
dq.appendleft(2)
dq.appendleft(3)
dq.appendleft(4)
dq.appendleft(5)print(dq.popleft())
print(dq.popleft())
print(dq.popleft())
print(dq.popleft())
print(dq.popleft())
print(dq.popleft())     # 栈为空,引出IndexError

其输出如下:

5
4
3
2
1
Traceback (most recent call last):File "D:\xxxxxx\CSDN.py", line 15, in <module>print(dq.popleft())     # 栈为空,引出IndexError
IndexError: pop from an empty deque

为了解决这个问题,我对 popleft() 操作进行了修改,修改后的代码如下:

from collections import dequedef deque_pop(dq: deque) -> deque:"""重新实现出栈操作:param dq: 栈:return: 出栈后的栈"""if len(dq) == 0:return deque()else:return dq.popleft()dq = deque()
dq.appendleft(1)
dq.appendleft(2)
dq.appendleft(3)
dq.appendleft(4)
dq.appendleft(5)print(deque_pop(dq))
print(deque_pop(dq))
print(deque_pop(dq))
print(deque_pop(dq))
print(deque_pop(dq))
print(deque_pop(dq))    # 栈为空

其输出如下:

5
4
3
2
1
deque([])

3. 队列

队列先进先出的结构,用双端队列实现。

3.1 队列操作-1

入对使用 dq.append(x) 操作,出对使用 dq.popleft() 操作!

实现代码如下:

from collections import dequedq = deque()
dq.append(1)
dq.append(2)
dq.append(3)
dq.append(4)
dq.append(5)print(dq.popleft())
print(dq.popleft())
print(dq.popleft())
print(dq.popleft())
print(dq.popleft())
print(dq.popleft())     # 队列为空,引出IndexError

其输出如下:

1
2
3
4
5
Traceback (most recent call last):File "D:\xxxxxx\CSDN.py", line 28, in <module>print(dq.popleft())     # 队列为空,引出IndexError
IndexError: pop from an empty deque

为了解决这个问题,我对 popleft() 操作进行了修改,修改后的代码如下:

from collections import dequedef deque_pop(dq: deque) -> deque:"""重新实现出对操作:param dq: 队列:return: 出对后的队列"""if len(dq) == 0:return deque()else:return dq.popleft()dq = deque()
dq.append(1)
dq.append(2)
dq.append(3)
dq.append(4)
dq.append(5)print(deque_pop(dq))
print(deque_pop(dq))
print(deque_pop(dq))
print(deque_pop(dq))
print(deque_pop(dq))
print(deque_pop(dq))  # 队列为空

其输出如下:

1
2
3
4
5
deque([])

3.2 队列操作-2

同样因为我们是用双端队列实现的栈,因此还可以换个方向当做队头,入对使用 dq.appendleft(x) 操作,出对使用 dq.pop() 操作!

实现代码如下:

from collections import dequedq = deque()
dq.appendleft(1)
dq.appendleft(2)
dq.appendleft(3)
dq.appendleft(4)
dq.appendleft(5)print(dq.pop())
print(dq.pop())
print(dq.pop())
print(dq.pop())
print(dq.pop())
print(dq.pop())     # 队列为空,引出IndexError

其输出如下:

1
2
3
4
5
Traceback (most recent call last):File "D:\xxxxxx\CSDN.py", line 28, in <module>print(dq.pop())     # 队列为空,引出IndexError
IndexError: pop from an empty deque

为了解决这个问题,我对 popleft() 操作进行了修改,修改后的代码如下:

from collections import dequedef deque_pop(dq: deque) -> deque:"""重新实现出对操作:param dq: 队列:return: 出对后的队列"""if len(dq) == 0:return deque()else:return dq.pop()dq = deque()
dq.appendleft(1)
dq.appendleft(2)
dq.appendleft(3)
dq.appendleft(4)
dq.appendleft(5)print(deque_pop(dq))
print(deque_pop(dq))
print(deque_pop(dq))
print(deque_pop(dq))
print(deque_pop(dq))
print(deque_pop(dq))  # 队列为空

其输出如下:

1
2
3
4
5
deque([])

总结

当然我们也可以自己写一个类来实现栈、队列等数据结构,下一篇文章将会开始介绍python中最重要的一个知识点:面向对象以及

不过我们自己写的栈或者队列的运算速度可能没本篇文章介绍的使用 collections.deque() 实现的快,因此以后可以使用这个内置函数来实现一些数据结构,即简单、运算还快!

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

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

相关文章

Linux(一)线程——何为线程???Linux线程控制

文章目录 什么是线程&#xff1f;&#xff1f;&#xff1f;线程和进程的区别和联系Linux线程控制POSIX线程库创建线程线程等待线程终止线程分离 什么是线程&#xff1f;&#xff1f;&#xff1f; 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的…

python用selenium网页模拟时无法定位元素解决方法1

进行网页模拟时&#xff0c;有时我们明明可以复制出元素的xpath&#xff0c;但是用selenium的xpath click无法点击到元素。这种情况有几种原因&#xff0c;本文写其中一种——iframe 比如下图网址&#xff0c;第二行出现iframe&#xff0c;则往下的行内元素都会定位不到&#…

编程语言:创新的例子——解构技术与艺术的交融

编程语言&#xff1a;创新的例子——解构技术与艺术的交融 在数字化时代的浪潮中&#xff0c;编程语言作为技术领域的核心要素&#xff0c;其创新步伐从未停歇。本文将通过四个方面、五个方面、六个方面和七个方面&#xff0c;深入探讨编程语言创新的例子&#xff0c;揭示技术…

2024最新最全【Java】全栈,零基础入门到精通

Java基础 本文章是作者的学习笔记&#xff0c;帮助初学者快速入门&#xff0c;内容讲的不是很细&#xff0c;适合初学者&#xff0c;不定时更新。 目录 Java基础数据类型1.基本类型(primitive type)1-1 整数类型1-2 浮点类型1-3 字符类型1-4 boolean类型 2.引用数据类型3.类型…

sap 批量创建销售订单

1.首先通过excel编辑好数据 2.tcode&#xff1a;smw0上传到服务器 3&#xff1a;tcode&#xff1a;se38执行代码 源代码如下链接&#xff1a; https://download.csdn.net/download/sinat_29663077/89531998?spm1001.2014.3001.5503

第9集《修习止观坐禅法要》

请大家打开讲义第二十二面&#xff0c;丁二、诃欲第二。 智者大师把这个止观的修行&#xff0c;分成十科。前面的五科是一个前方便&#xff0c;叫做天台二十五方便。这个方便当中的修行呢&#xff0c;这个地方是属于第二科、诃欲。 那么这个诃&#xff0c;就是诃责&#xff0…

java:将集合中的数据放到文件中

代码实现目标&#xff1a; 将集合中的数据写道文件中通过字符缓冲输出流实现 代码展示 public static void main(String[] args) throws IOException {//创建ArrayList集合ArrayList<Student> array new ArrayList<>();//创建学生对象Student s1 new Student(&…

面试总结-基础js

一、变量提升&#xff08;函数里面先形参赋值&#xff0c;再变量提升&#xff0c;最后执行代码&#xff09; 1、概念&#xff1a;当浏览器开辟出供代码执行的栈内存后&#xff0c;代码并没有自上而下立即执行&#xff0c;而是继续做了一些事情&#xff0c;把当前作用域所有带v…

python程序打包成.exe

python程序打包成.exe 安装 PyInstaller打包 Python 程序PyInstaller 命令选项生成的文件示例注意事项 将 Python 程序打包成 .exe 文件&#xff0c;可以使用 PyInstaller。PyInstaller 是一个非常流行的工具&#xff0c;可以将 Python 程序及其所有依赖项打包成一个独立的可执…

【前端】有时候你可能需要SSE而不是WebSocket

深度解析&#xff1a;轮询、SSE 和 WebSocket 在构建实时应用时&#xff0c;开发者面临多种选择&#xff0c;其中最常见的是轮询&#xff08;Polling&#xff09;、服务器推送事件&#xff08;Server-Sent Events&#xff0c;SSE&#xff09;和 WebSocket。本文将深入解析这三…

kind kubernetes(k8s虚拟环境)使用本地docker的镜像

kubernetes中&#xff0c;虽然下载镜像使用docker&#xff0c;但是存储在docker image里的镜像是不能被k8s直接使用的&#xff0c;但是kind不同&#xff0c;可以使用下面的方法&#xff0c;让kind kubernetes环境使用docker image里的镜像。 kind – Quick Start 例如&#x…

华为机考真题 -- 螺旋数字矩阵

题目描述&#xff1a; 疫情期间&#xff0c;小明隔离在家&#xff0c;百无聊赖&#xff0c;在纸上写数字玩。他发明了一种写法&#xff1a;给出数字 个数 n 和行数 m&#xff08;0 < n ≤ 999&#xff0c;0 < m ≤ 999&#xff09;&#xff0c;从左上角的 1 开始&#x…

M12电源分配器:高效率与可靠性的工业解决方案

关键词&#xff1a;M12电源分配器、M12电源接线盒、M12电源分线盒 摘要 M12电源分配器是工业环境中实现高效与可靠电源管理的现代化解决方案。该设备采用坚固的金属外壳和封闭式设计&#xff0c;保证了在严苛工业条件下的稳定运行&#xff0c;达到IP67等级的防护性能&#xf…

NumPy提供了哪些高级的数学和数值计算功能

NumPy&#xff08;Numerical Python&#xff09;是Python中用于科学计算的基础库&#xff0c;它提供了高性能的多维数组对象&#xff08;ndarray&#xff09;以及一系列用于操作这些数组的数学和数值计算功能。以下是NumPy提供的一些高级的数学和数值计算功能&#xff1a; 1. …

FastAPI 学习之路(三十八)Static Files

如果使用前后台不分离的开发方式&#xff0c;那么模版文件中使用的静态文件&#xff0c;比如css/js等文件的目录需要在后台进行配置&#xff0c;以便模版渲染是能够正确读取到这些静态文件的。那么我们如何处理呢&#xff1f; 首先安装依赖 pip install aiofiles 我们看下如何…

蓝队必备技能--yara-让自己编写AVVT

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…

51单片机STC89C52RC——16.1 五线四相步进电机

目录 目的/效果 一&#xff0c;STC单片机模块 二&#xff0c;步进电机 2.2 什么是步进电机&#xff1f; 2.2.1 步进电机驱动板 静态参数 动态参数 2.2.2 五线四相 单相激励步进 双相激励步进 混合激励驱动 2.3 细分驱动 2.4 通过数字信号控制旋转位置和转速。 2…

金蝶云苍穹-插件开发(四)GPT开发相关插件

我只对GPT开发的相关插件进行讲解&#xff0c;因为我的是插件开发教程&#xff0c;关于GPT的一些提示词的写法&#xff0c;GPT任务的配置&#xff0c;请去金蝶云苍穹的文档和社区内学习。 GPT自定义操作 GPT自定义操作的代码的类要实现 IGPTAction 这个接口&#xff0c;这个接…

基于Java+Vue的场馆预约系统源码体育馆羽毛球馆篮球馆预约

市场前景 市场需求持续增长&#xff1a;近年来&#xff0c;随着人们生活水平的提高和休闲娱乐需求的多样化&#xff0c;各类场馆&#xff08;如体育馆、图书馆、博物馆、剧院等&#xff09;的访问量不断增加。然而&#xff0c;传统的预约方式往往存在效率低下、信息不透明等问…

AI算力中心研究分析

中国 AI 算力中心研究报告 算力产业稳健发展&#xff0c;算力创新能力持续增强&#xff0c;推动我国数字经济量质齐升。 2022 年我国算力规模稳步扩张&#xff0c;算力发展为拉动我国 GDP 增长做出突出贡献&#xff0c;在 2016-2022 年期间&#xff0c;我国算力规模平均每年增…