Python数据结构:实现自定义栈与队列

news2024/11/24 12:39:00

def7a0b472ae26985d59a098983c7b55.png

更多Python学习内容:ipengtao.com

在计算机科学中,栈(Stack)和队列(Queue)是两种常见的数据结构。它们在算法和数据处理方面有着广泛的应用。本文将详细介绍如何在Python中实现自定义的栈与队列,并包含详细的示例代码,帮助深入理解这两种数据结构的工作原理和使用方法。

栈(Stack)

什么是栈

栈是一种遵循后进先出(LIFO, Last In First Out)原则的线性数据结构。栈的基本操作包括压栈(push)、弹栈(pop)和查看栈顶元素(peek)。

栈的基本操作

  1. 压栈(push):将元素添加到栈顶。

  2. 弹栈(pop):从栈顶移除元素。

  3. 查看栈顶元素(peek):获取栈顶元素但不移除它。

  4. 检查栈是否为空(is_empty):检查栈是否为空。

  5. 获取栈的大小(size):获取栈中元素的数量。

实现自定义栈

class Stack:
    def __init__(self):
        self.items = []

    def is_empty(self):
        return len(self.items) == 0

    def push(self, item):
        self.items.append(item)

    def pop(self):
        if self.is_empty():
            raise IndexError("pop from empty stack")
        return self.items.pop()

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

    def size(self):
        return len(self.items)

    def __str__(self):
        return "Stack: " + str(self.items)

# 示例
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)
print(stack)  # 输出: Stack: [1, 2, 3]
print("栈顶元素:", stack.peek())  # 输出: 栈顶元素: 3
print("弹栈元素:", stack.pop())  # 输出: 弹栈元素: 3
print(stack)  # 输出: Stack: [1, 2]

队列(Queue)

什么是队列

队列是一种遵循先进先出(FIFO, First In First Out)原则的线性数据结构。队列的基本操作包括入队(enqueue)、出队(dequeue)和查看队头元素(front)。

队列的基本操作

  1. 入队(enqueue):将元素添加到队尾。

  2. 出队(dequeue):从队头移除元素。

  3. 查看队头元素(front):获取队头元素但不移除它。

  4. 检查队列是否为空(is_empty):检查队列是否为空。

  5. 获取队列的大小(size):获取队列中元素的数量。

实现自定义队列

class Queue:
    def __init__(self):
        self.items = []

    def is_empty(self):
        return len(self.items) == 0

    def enqueue(self, item):
        self.items.append(item)

    def dequeue(self):
        if self.is_empty():
            raise IndexError("dequeue from empty queue")
        return self.items.pop(0)

    def front(self):
        if self.is_empty():
            raise IndexError("front from empty queue")
        return self.items[0]

    def size(self):
        return len(self.items)

    def __str__(self):
        return "Queue: " + str(self.items)

# 示例
queue = Queue()
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
print(queue)  # 输出: Queue: [1, 2, 3]
print("队头元素:", queue.front())  # 输出: 队头元素: 1
print("出队元素:", queue.dequeue())  # 输出: 出队元素: 1
print(queue)  # 输出: Queue: [2, 3]

栈与队列的应用

栈的应用:括号匹配

栈常用于检查表达式中的括号是否匹配。

def is_balanced(expression):
    stack = Stack()
    matching_brackets = {')': '(', ']': '[', '}': '{'}
    for char in expression:
        if char in matching_brackets.values():
            stack.push(char)
        elif char in matching_brackets.keys():
            if stack.is_empty() or stack.pop() != matching_brackets[char]:
                return False
    return stack.is_empty()

# 示例
expression = "{[()]}"
print(f"表达式 {expression} 是否平衡: {is_balanced(expression)}")  # 输出: 表达式 {[()]} 是否平衡: True

队列的应用:任务调度

队列常用于任务调度,按顺序处理任务。

def task_scheduler(tasks):
    queue = Queue()
    for task in tasks:
        queue.enqueue(task)
    while not queue.is_empty():
        current_task = queue.dequeue()
        print(f"处理任务: {current_task}")

# 示例
tasks = ["任务1", "任务2", "任务3"]
task_scheduler(tasks)
# 输出:
# 处理任务: 任务1
# 处理任务: 任务2
# 处理任务: 任务3

栈与队列的高级实现

使用链表实现栈

链表是一种动态数据结构,可以用于实现灵活的栈。

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class LinkedListStack:
    def __init__(self):
        self.top = None

    def is_empty(self):
        return self.top is None

    def push(self, item):
        new_node = Node(item)
        new_node.next = self.top
        self.top = new_node

    def pop(self):
        if self.is_empty():
            raise IndexError("pop from empty stack")
        data = self.top.data
        self.top = self.top.next
        return data

    def peek(self):
        if self.is_empty():
            raise IndexError("peek from empty stack")
        return self.top.data

    def size(self):
        count = 0
        current = self.top
        while current:
            count += 1
            current = current.next
        return count

    def __str__(self):
        result = []
        current = self.top
        while current:
            result.append(current.data)
            current = current.next
        return "LinkedListStack: " + str(result)

# 示例
stack = LinkedListStack()
stack.push(1)
stack.push(2)
stack.push(3)
print(stack)  # 输出: LinkedListStack: [3, 2, 1]
print("栈顶元素:", stack.peek())  # 输出: 栈顶元素: 3
print("弹栈元素:", stack.pop())  # 输出: 弹栈元素: 3
print(stack)  # 输出: LinkedListStack: [2, 1]

使用链表实现队列

同样地,链表也可以用于实现灵活的队列。

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class LinkedListQueue:
    def __init__(self):
        self.front = None
        self.rear = None

    def is_empty(self):
        return self.front is None

    def enqueue(self, item):
        new_node = Node(item)
        if self.rear:
            self.rear.next = new_node
        self.rear = new_node
        if self.front is None:
            self.front = self.rear

    def dequeue(self):
        if self.is_empty():
            raise IndexError("dequeue from empty queue")
        data = self.front.data
        self.front = self.front.next
        if self.front is None:
            self.rear = None
        return data

    def front(self):
        if self.is_empty():
            raise IndexError("front from empty queue")
        return self.front.data

    def size(self):
        count = 0
        current = self.front
        while current:
            count += 1
            current = current.next
        return count

    def __str__(self):
        result = []
        current = self.front
        while current:
            result.append(current.data)
            current = current.next
        return "LinkedListQueue: " + str(result)

# 示例
queue = LinkedListQueue()
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
print(queue)  # 输出: LinkedListQueue: [1, 2, 3]
print("队头元素:", queue.front())  # 输出: 队头元素: 1
print("出队元素:", queue.dequeue())  # 输出: 出队元素: 1
print(queue)  # 输出: LinkedListQueue: [2, 3]

总结

本文详细介绍了如何在Python中实现自定义的栈与队列,包括基本操作、链表实现以及常见应用场景。栈和队列是基础的数据结构,在算法设计和数据处理方面有着广泛的应用。通过掌握这些数据结构的实现和使用方法,可以帮助大家在编程中更好地组织和管理数据,提高程序的效率和可读性。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!


如果想要系统学习Python、Python问题咨询,或者考虑做一些工作以外的副业,都可以扫描二维码添加微信,围观朋友圈一起交流学习。

8ebcf4e75296281bd0e0ca4251873c30.gif

我们还为大家准备了Python资料和副业项目合集,感兴趣的小伙伴快来找我领取一起交流学习哦!

3978414346cde26a0f79a5824e0246c5.jpeg

往期推荐

历时一个月整理的 Python 爬虫学习手册全集PDF(免费开放下载)

Python基础学习常见的100个问题.pdf(附答案)

学习 数据结构与算法,这是我见过最友好的教程!(PDF免费下载)

Python办公自动化完全指南(免费PDF)

Python Web 开发常见的100个问题.PDF

肝了一周,整理了Python 从0到1学习路线(附思维导图和PDF下载)

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

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

相关文章

stm32精密控制步进电机(升级篇)

这一篇文章里会深入的对步进电机控制方法进行论述 如何避免步进电机丢转的问题 1.机械结构:排查一下传动的问题,举个例子,我的毕设里大臂机械臂的步进电机有时会有丢转问题,造成无法运动到指定位置,后面发现是因为皮带…

【单元测试】SpringBoot

【单元测试】SpringBoot 1. 为什么单元测试很重要?‼️ 从前,有一个名叫小明的程序员,他非常聪明,但有一个致命的缺点:懒惰。小明的代码写得又快又好,但他总觉得单元测试是一件麻烦事,觉得代码…

2.RabbitMQ相关概念

介绍 RabbitMQ是一个消息中间件,接受并转发消息。它接收、存储和转发消息数据。 四大核心概念: 1.生产者 产生数据发送消息的程序是生产者。 2.消费者 3.队列 每一个队列对应一个消费者。 如果两个消费者对应同一个队列,那么队列中的…

云监控(华为) | 实训学习day1(10)

云监控:确保服务器高效运行 在当今的数字化时代,服务器的稳定运行对于任何企业都至关重要。为了确保服务器的 CPU、内存和硬盘等资源的合理运行,云监控成为了一项不可或缺的技术。本文将详细介绍云监控的基本概念、所需软件、配置方法以及如何…

分布式 I/O 系统 BL200 Modbus TCP 耦合器

BL200 耦合器是一个数据采集和控制系统,基于强大的 32 位微处理器设计,采用 Linux 操作系统,支持 Modbus 协议,可以快速接入现场 PLC、SCADA 以及 ERP 系统, 内置逻辑控制、边缘计算应用,适用于 IIoT 和工业…

redis登录缓存

1.pom.xml中引入redis依赖 <!-- Redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 2.将登录成功的token存储到redis中 if(Md5…

捷配PCB打样采用机械盲埋孔制造,有何优势?

在电子制造领域&#xff0c;盲孔&#xff08;Blind Vias&#xff09;与埋孔&#xff08;Buried Vias&#xff09;是两种关键的PCB&#xff08;印刷电路板&#xff09;过孔技术。盲孔特指那些连接内层走线至外层走线的过孔&#xff0c;但并不贯穿整个板体。相对地&#xff0c;埋…

【数学建模】技术革新——Lingo的使用超详解

目录 基础知识 1. 变量声明 示例 2. 常量声明 语法格式 示例 3. 目标函数 语法格式 示例 4. 约束条件 语法格式 示例 5. 完整的Lingo模型示例 示例 解释 6. 整数变量声明 语法格式 示例 7. 非线性规划 示例 8. 多目标优化 语法格式 示例 9. 数据输入与…

持续集成02--Linux环境更新/安装Java新版本

前言 在持续集成/持续部署&#xff08;CI/CD&#xff09;的旅程中&#xff0c;确保开发环境的一致性至关重要。本篇“持续集成02--Linux环境更新/安装Java新版本”将聚焦于如何在Linux环境下高效地更新或安装Java新版本。Java作为广泛应用的编程语言&#xff0c;其版本的更新对…

ModuleNotFoundError: No module named ‘_cffi_backend‘的二中情况解决方案

1、问题概述? 创作时间:2024年7月 在pycharm中执行python脚本出现如下问题: No module named _cffi_backend 主要说明二中情况: 第一种原因:最常见的原因就是没有安装cffi模块,我们通过命令安装就可以了。 第二种原因:不常见的原因,如果你在pycharm中运行了别人的…

【自撰写】【国际象棋入门】第10课 常见兵型及其分析

第10课 常见兵型及其分析 兵型是国际象棋棋局当中十分重要的局面因素。好的兵型不仅可以为己方创造空间和布局上的优势&#xff0c;也能够充当进攻或者防守时的有力工具&#xff1b;与此同时&#xff0c;坏的兵型则会削弱己方的优势&#xff0c;并给对方创造进攻的可乘之机。本…

MySQL Workbench下载安装

官方下载地址&#xff1a; https://dev.mysql.com/downloads/workbench/ 下载完后&#xff0c;点击安装包即可 但是安装之前&#xff0c;必须要先安装Visual C 2019运行库 安装完后&#xff0c;添加数据库连接 点击 Schemas可以看到列表 点击Server可以找到导出、导入数据的菜…

Godoc学习:安装Godoc

目录 前言 1&#xff0c;安装python 2&#xff0c;安装Scons 3&#xff0c;拉取Godoc代码 4&#xff0c;编译并生成工程 前言 根据官网教程安装&#xff1a; 1&#xff0c;安装python 注意&#xff1a;我安装的是3.9的版本&#xff0c;不建议安装最新的版本&#xff0c;…

【FPGA】优雅地使用ILA进行FPGA硬件调试

Vivado&#xff08;Vitis&#xff09;版本&#xff1a;2020.2FPGA开发板&#xff1a;Microphase Z7-Lite 7020开发板 FPGA设计调试流程 FPGA开发是一个不断迭代的过程&#xff0c;一般的FPGA设计流程一般包含下面几个步骤&#xff1a; 硬件架构和算法验证&#xff1a;实现需要…

权威认可 | 海云安开发者安全助手系统通过信通院支撑产品功能认证并荣获信通院2024年数据安全体系建设优秀案例

近日&#xff0c;2024全球数字经济大会——数字安全生态建设专题论坛&#xff08;以下简称“论坛”&#xff09;在京成功举办。由全球数字经济大会组委会主办&#xff0c;中国信息通信研究院及公安部第三研究所共同承办&#xff0c;论坛邀请多位专家和企业共同参与。 会上颁发…

【ollama】ollama运行GLM4-9B和CodeGeeX4-ALL-9B

一、GGUF模型链接 glm-4-9b-chat-GGUFcodegeex4-all-9b-GGUF 使用modelscope下载 先安装 pip install modelscope 命令1 modelscope download --modelLLM-Research/glm-4-9b-chat-GGUF --local_dir . glm-4-9b-chat.Q5_K.gguf命令2 modelscope download --modelLLM-Researc…

一图了解网络通信原理

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

SHOT(方向直方图)

Salti等人在2014年提出一种表面匹配的局部三维描述子SHOT。Salti等人将现有三维局部特征描述方法分为两类&#xff0c;即基于特征的描述方法与基于直方图的描述方法&#xff0c;并分析了两种方法的优势&#xff0c;提出基于特征的局部特征描述方法要比后者在特征的描述能力上更…

Unity动画系统(3)---融合树

6.1 动画系统基础2-6_哔哩哔哩_bilibili Animator类 using System.Collections; using System.Collections.Generic; using UnityEngine; public class EthanController : MonoBehaviour { private Animator ani; private void Awake() { ani GetComponen…

Porfinet从转DeviceNet从总线协议转换网关

产品功能 1. 远创智控YC-DNT-PN型是Porfinet从转Devicenet从工业级Porfinet 网关。‌这种网关设备允许将Porfinet网络中的设备连接到Devicenet网络中&#xff0c;‌从而实现不同工业通信协议之间的互操作性。‌这些网关设备通常具有两个以太网接口&#xff0c;‌分别用于连接Po…