【python】数据结构之栈与队列

在Python3中,列表(list)是一种非常灵活的数据结构,可以用来实现多种其他数据结构,包括栈(Stack)、队列(Queue)。虽然Python的内置列表已经提供了很多强大的功能,但有时候为了实现特定的数据操作行为(如LIFO、FIFO或动态大小),我们可能会选择用列表来模拟这些数据结构。

栈(Stack)

栈是一种后进先出(LIFO, Last In First Out)的数据结构。在Python中,我们可以使用列表的append()和pop()方法来实现栈。

class Stack:
    def __init__(self, max_size: int):
        self.items = []
        self.max_size = max_size
        self.size = 0

    def length(self):
        return self.size

    def is_empty(self):
        return self.size == 0

    def is_full(self):
        return self.size == self.max_size

    def push(self, item):
        if self.is_full():
            raise Exception("stack is full")
        self.items.append(item)
        self.size += 1

    def pop(self):
        if self.is_empty():
            raise Exception("stack is empty")
        self.size -= 1
        return self.items.pop()

    def peek(self):
        if self.is_empty():
            raise Exception("stack is empty")
        return self.items[-1]

stack = Stack(3)
stack.push(1)
stack.push(2)
stack.push(3)
print(stack.length())
print(stack.pop())
print(stack.pop())
print(stack.pop())
print(stack.pop())

运行结果如下:

3
3
2
1
Traceback (most recent call last):
  File "stack_demo.py", line 42, in <module>
    print(stack.pop())
          ^^^^^^^^^^^
  File "stack_demo.py", line 25, in pop
    raise Exception("stack is empty")
Exception: stack is empty

队列(Queue)

队列是一种先进先出(FIFO, First In First Out)的数据结构。在Python中,同样可以使用列表来实现队列。


class Queue:
    def __init__(self, max_size: int):
        self.items = []
        self.max_size = max_size
        self.size = 0

    def length(self):
        return self.size

    def is_empty(self):
        return self.size == 0

    def is_full(self):
        return self.size == self.max_size

    def enqueue(self, item):
        if self.is_full():
            raise Exception("queue is full")
        self.items.append(item)
        self.size += 1

    def dequeue(self):
        if self.is_empty():
            raise Exception("stack is empty")
        self.size -= 1
        return self.items.pop(0)

queue = Queue(3)
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
print(queue.length())
print(queue.dequeue())
print(queue.dequeue())
print(queue.dequeue())
print(queue.dequeue())

运行结果如下:

3
1
2
3
Traceback (most recent call last):
  File "queue_demo.py", line 37, in <module>
    print(queue.dequeue())
          ^^^^^^^^^^^^^^^
  File "queue_demo.py", line 25, in dequeue
    raise Exception("stack is empty")
Exception: stack is empty

双端队列(deque)

虽然Python的列表可以用来实现队列,但使用collections.deque(双端队列)通常更高效,因为它在两端进行插入和删除操作的时间复杂度都是O(1)。

collections.deque是Python标准库collections模块中的一个双端队列(double-ended queue)的实现。双端队列是一种具有两个端点的队列,允许在两端快速地添加(append)和弹出(pop)元素。这使得deque非常适合用作需要频繁在两端进行操作的场景,比如实现一个缓存(cache)或者一个队列(queue)和栈(stack)的混合体。

主要特点

  • 快速从两端添加或删除元素:deque提供了在两端进行O(1)时间复杂度的append和pop操作,这意味着无论队列的大小如何,这些操作的速度都是恒定的。
  • 线程安全:虽然deque的操作本身不是原子性的,但它在内部使用了锁,使得在多线程环境下对deque的迭代通常是安全的(尽管在迭代过程中修改deque可能会导致未定义行为)。
  • 内存效率:与列表(list)相比,deque在内存使用上更加高效,特别是在元素数量非常大时。这是因为列表是基于数组的,而 deque是基于双向链表的。

基本操作

创建双端队列:

  • 通过collections.deque()来创建一个空的双端队列
  • 通过collections.deque([iterable])来创建一个预填充了元素的双端队列。

添加元素:

  • append(x):在右端添加一个元素。
  • appendleft(x):在左端添加一个元素。

移除元素:

  • pop():移除并返回右端的元素。
  • popleft():移除并返回左端的元素。

查看元素:

  • deque[0]:查看左端元素,不移除
  • deque[-1]:查看右端元素,不移除

长度:可以使用len(deque)来获取deque的长度。

迭代:deque支持迭代,可以像列表一样遍历其中的元素。

使用示例

from collections import deque

# 创建一个空的双端队列
dq = deque()

# 在右端添加元素
dq.append(1)
dq.append(2)

# 在左端添加元素
dq.appendleft(0)

# 打印队列内容
print(dq)  # 输出: deque([0, 1, 2])

# 从右端移除元素
print(dq.pop())  # 输出: 2

# 从左端移除元素
print(dq.popleft())  # 输出: 0

# 打印剩余元素
print(dq)  # 输出: deque([1])

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【游戏中orika完成一个Entity的复制及其Entity异步落地的实现】 1.ctrl+shift+a是飞书下的截图 2.落地实现

一、orika工具使用 1)工具类 package com.xinyue.game.utils;import ma.glasnost.orika.MapperFactory; import ma.glasnost.orika.impl.DefaultMapperFactory;/*** author 王广帅* since 2022/2/8 22:37*/ public class XyBeanCopyUtil {private static MapperFactory mappe…

黑马Redis数据结构学习笔记

Redis数据结构 动态字符串 Intset Dict ZipList QuickList SkipList 类似倍增 RedisObject 五种数据类型 String List Set ZSet Hash

GTID详解

概念和组成 1&#xff0c;全局事务表示&#xff1a;global transaction identifiers 2, GTID和事务一一对应&#xff0c;并且全局唯一 3&#xff0c;一个GTID在一个服务器上只执行一次 4&#xff0c;mysql 5.6.5开始支持 组成 GTID server_uuid:transaction_id 如&#xf…

怎么将pdf中的某一个提取出来?介绍几种提取PDF中页面的方法

怎么将pdf中的某一个提取出来&#xff1f;传统上&#xff0c;我们可能通过手动截取屏幕或使用PDF阅读器的复制功能来提取信息&#xff0c;但这种方法往往不够精确&#xff0c;且无法保留原文档的排版和格式。此外&#xff0c;很多时候我们需要提取的内容可能涉及多个页面、多个…

RTU 通信模块赋能智慧路灯远程开关管理,点亮智慧城市节能增效

RTU&#xff08;Remote Terminal Unit&#xff09;远端测控单元在智慧路灯远程开关管理系统中主要负责数据通信和开关控制。能够实现对路灯设备的远程监测和控制&#xff0c;将路灯的状态信息&#xff08;如开关状态、故障信息、亮度参数等&#xff09;上传到管理平台&#xff…

【Canvas与艺术】红色3号桌球

【注】 此图立体感还差点&#xff0c;以后改进吧。 【成图】 120*120的png图标&#xff1a; 大小图&#xff1a; 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8&q…

从源码分析swift GCD_DispatchGroup

前言&#xff1a; 最近在写需求的时候用到了DispatchGroup&#xff0c;一直没有深入去学习&#xff0c;既然遇到了那么就总结下吧。。。。 基本介绍&#xff1a; 任务组&#xff08;DispatchGroup&#xff09; DispatchGroup 可以将多个任务组合在一起并且监听它们的完成状态。…

线性代数基础与应用:基底 (Basis) 与现金流及单期贷款模型(中英双语)

具体请参考&#xff1a;https://web.stanford.edu/~boyd/vmls/ 下面的例子来源于这本书。 线性代数基础与应用&#xff1a;基底 (Basis) 与现金流及单期贷款模型 在线性代数中&#xff0c;基底&#xff08;Basis&#xff09;是一个重要的概念&#xff0c;广泛应用于信号处理、…

【python】OpenCV—Image Moments

文章目录 1、功能描述2、图像矩3、代码实现4、效果展示5、完整代码6、涉及到的库函数cv2.moments 7、参考 1、功能描述 计算图像的矩&#xff0c;以质心为例 2、图像矩 什么叫图像的矩&#xff0c;在数字图像处理中有什么作用&#xff1f; - 谢博琛的回答 - 知乎 https://ww…

【漏洞复现】CVE-2022-45206 CVE-2023-38905 SQL Injection

漏洞信息 NVD - CVE-2022-45206 Jeecg-boot v3.4.3 was discovered to contain a SQL injection vulnerability via the component /sys/duplicate/check. NVD - CVE-2023-38905 SQL injection vulnerability in Jeecg-boot v.3.5.0 and before allows a local attacker to…

现代风格VUE3易支付用户控制中心

适用系统 彩虹易支付 技术栈 vitevue3elementuiplusphp 亮点 独立前端代码,扩展开发,不改动系统文件,不影响原版升级 支持功能订制 界面预览

开发技术-Java改变图片格式

图片上传页未做控制&#xff0c;导致上传的是GIF格式&#xff0c;导致图片识别失败。需要将GIF格式转为JPEG格式。 代码&#xff0c;是找AI写的&#xff0c;记录一下&#xff1a; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; im…

【计算机视觉基础CV】03-深度学习图像分类实战:鲜花数据集加载与预处理详解

本文将深入介绍鲜花分类数据集的加载与处理方式&#xff0c;同时详细解释代码的每一步骤并给出更丰富的实践建议和拓展思路。以实用为导向&#xff0c;为读者提供从数据组织、预处理、加载到可视化展示的完整过程&#xff0c;并为后续模型训练打下基础。 前言 在计算机视觉的深…

Unity-Editor扩展GUI基本实现一个可拖拉放的格子列表

短短几百行代码,好吧,又是“参考”了国外的月亮 操作,还真地挺自然的。。。。。。国外的实现有点小牛 拖拉,增加+ 一个Element 鼠标左键长按,可以出提示 鼠标右键,清除Element, 有点小bug,不是很自然地完全清除, using System.Collections; using System.Collecti…

修改vscode中emmet中jsx和tsx语法中className的扩展符号从单引号到双引号 - HTML代码补全 - 单引号双引号

效果图 实现步骤 文件 > 首选项 > 设置搜索“”在settings.json中修改&#xff0c;增加 "emmet.syntaxProfiles": {"html": {"attr_quotes": "single"},"jsx": {"attr_quotes": "double","…

首批|云轴科技ZStack成为开放智算产业联盟首批会员单位

近日 &#xff0c;在Linux基金会AI & Data及中国开源软件推进联盟的指导之下&#xff0c;开放智算产业联盟成立大会在北京成功召开。在大会上&#xff0c;联盟首次公布了组织架构并颁发了首批会员单位证书。凭借ZStack AIOS平台智塔和在智算领域的技术创新&#xff0c;云轴…

HTN 78A3 6V~140V输入,3A实地异步降压变换器

1、特征 3A降压&#xff0c;内置250mΩ高侧功率管 输入电压范围:6V~140V 脉冲跳跃模式使得轻载下高效率 最高1MHZ可编程开关频率 COT纹波电压控制架构 欠压保护、过流保护和过热关断保护 无铅封装&#xff0c;ESOP8 2、应用 二轮电瓶车 太阳能系统 高压电池组 …

以太网帧、IP数据报图解

注&#xff1a;本文为 “以太网帧、IP数据报”图解相关文章合辑。 未整理去重。 以太网帧、IP数据报的图解格式&#xff08;包含相关例题讲解&#xff09; Rebecca.Yan已于 2023-05-27 14:13:19 修改 一、基础知识 UDP 段、IP 数据包&#xff0c;以太网帧图示 通信过程中&…

汽车IVI中控开发入门及进阶(三十九):ADAS的车道线检测

概述: 自动驾驶汽车中确保驾驶员和乘客安全环境的重要系统之一是高级驾驶员辅助系统(ADAS)。自适应巡航控制、自动制动/转向、车道保持系统、盲点辅助、车道偏离警告系统和车道检测都是ADAS的示例。车道检测向车辆的智能系统显示特定于车道线结构几何特征的信息,以显示车道…

Liveweb视频汇聚平台支持WebRTC协议赋能H.265视频流畅传输

随着科技的飞速发展和网络技术的不断革新&#xff0c;视频监控已经广泛应用于社会各个领域&#xff0c;成为现代安全管理的重要组成部分。在视频监控领域&#xff0c;视频编码技术的选择尤为重要&#xff0c;它不仅关系到视频的质量&#xff0c;还直接影响到视频的传输效率和兼…