Python中的魔法:栈与队列的奇妙之旅

news2024/9/21 22:38:40

引言

在软件开发过程中,我们常常需要处理大量的数据,并以特定的方式组织这些数据以便于后续的操作。例如,在浏览器的历史记录管理、函数调用的过程控制、打印机的任务调度等场景下,栈与队列便大显身手。栈遵循后进先出(LIFO, Last In First Out)原则,而队列则是先进先出(FIFO, First In First Out)。这两种数据结构因其简单高效的特点,在实际应用中发挥着至关重要的作用。

基础语法介绍

栈是一种只允许在一端进行插入或删除操作的数据结构。这个端点通常被称为“栈顶”。栈的操作主要有两种:入栈(push)和出栈(pop)。在Python中,我们可以利用列表(list)来模拟栈的行为。

stack = []  # 创建一个空栈

# 入栈操作
stack.append('A')
stack.append('B')
print(stack)  # 输出: ['A', 'B']

# 出栈操作
item = stack.pop()
print(item)  # 输出: B
print(stack)  # 输出: ['A']

队列

与栈不同的是,队列允许在其一端插入元素(入队),而在另一端移除元素(出队)。这种特性非常适合用来模拟现实生活中的排队现象,如银行窗口服务、公交车站乘客等待等。

from collections import deque  # 使用deque来实现队列

queue = deque()  # 创建一个空队列

# 入队操作
queue.append('Alice')
queue.append('Bob')
print(queue)  # 输出: deque(['Alice', 'Bob'])

# 出队操作
person = queue.popleft()
print(person)  # 输出: Alice
print(queue)  # 输出: deque(['Bob'])

基础实例:简单的栈与队列应用

假设我们需要设计一个程序来模拟银行柜台的服务流程。顾客进入银行后需先取号排队,当某个柜台空闲时,将按顺序呼叫下一个顾客前来办理业务。

class BankQueue:
    def __init__(self):
        self.queue = deque()

    def enqueue(self, customer_name):
        self.queue.append(customer_name)
        print(f"{customer_name} 加入了队列")

    def serve_next(self):
        if not self.queue:
            print("队列为空,没有顾客等待")
        else:
            served_customer = self.queue.popleft()
            print(f"正在为 {served_customer} 办理业务")

# 示例使用
bank = BankQueue()
bank.enqueue('张三')
bank.enqueue('李四')
bank.serve_next()  # 输出: 正在为 张三 办理业务
bank.serve_next()  # 输出: 正在为 李四 办理业务

进阶实例:复杂环境下的应用

当面临更复杂的系统设计时,如何有效地利用栈与队列来优化性能?比如在一个网页浏览器中,如何高效地管理用户的前进后退历史记录?

class WebBrowser:
    def __init__(self):
        self.history = []
        self.future = []

    def navigate(self, url):
        if self.history:
            self.future = self.history[1:]  # 保存当前页面之后的历史记录作为未来可以前进的页面
            self.history = [self.history[0]]  # 清空历史记录,仅保留当前页面
        self.history.append(url)
        print(f"导航至 {url}")

    def go_back(self):
        if len(self.history) > 1:
            self.future.append(self.history.pop())  # 将当前页面存入未来可前进页面列表
            print(f"返回至上一页 {self.history[-1]}")
        else:
            print("已到达历史记录的起始页")

    def go_forward(self):
        if self.future:
            page = self.future.pop()
            self.history.append(page)
            print(f"前进至 {page}")
        else:
            print("无法前进,已到达历史记录的最后一页")

# 示例使用
browser = WebBrowser()
browser.navigate('https://www.example.com')
browser.navigate('https://www.example.com/page1')
browser.go_back()
browser.go_forward()
browser.navigate('https://www.example.com/page2')
browser.go_back()
browser.go_back()
browser.go_forward()
browser.go_forward()

实战案例:真实项目中的应用

在大型电商网站的商品推荐系统中,栈与队列同样扮演着重要角色。通过对用户浏览行为的实时追踪,系统能够快速响应用户的请求,提供个性化的产品建议。

class ProductRecommendationSystem:
    def __init__(self):
        self.viewed_products = deque(maxlen=10)  # 最多存储最近浏览过的10件商品

    def add_viewed_product(self, product_id):
        self.viewed_products.append(product_id)

    def get_recent_views(self):
        return list(self.viewed_products)

# 示例使用
recommendation_system = ProductRecommendationSystem()
recommendation_system.add_viewed_product(12345)
recommendation_system.add_viewed_product(67890)
print(recommendation_system.get_recent_views())  # 输出: [12345, 67890]

通过以上实例可以看到,合理运用栈与队列不仅能够提升程序运行效率,还能极大地改善用户体验。无论是在简单的日常任务处理中,还是在复杂系统的架构设计上,它们都是不可或缺的好帮手。

扩展讨论

尽管本文主要探讨了栈与队列的基本概念及其在Python中的实现方式,但值得注意的是,随着技术的发展,更多高效的数据结构和算法不断涌现。例如,双端队列(deque)提供了对两端进行操作的支持;优先级队列则允许根据元素的优先级进行排序。此外,还有诸如链表实现的栈与队列等变种形式,它们各自具有不同的优缺点,在选择使用时需根据具体需求灵活决定。

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

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

相关文章

Linux 基础IO 2

读取与写入 read与fread 在基础IO 1中我们学会了open和fopen的函数这两个函数是用于为进程打开文件也可以理解为为进程和文件建立了一个链接使其可以交互。那我们建立号链接之后肯定还是需要对文件进行操作,现在我们先来了解读取操作。 read: 这是一…

Leetcode面试经典150题-94.二叉树的中序遍历

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2]示例 2: 输入:root [] 输出:[]示例 3: 输入:root [1] 输出&am…

SOMEIP_ETS_120: SD_Initial_Events_after_Subscribe_with_alternate_IPs

测试目的: 验证DUT在接收到Tester的SubscribeEventgroup消息后,能够向Tester指定的IP地址和端口发送SubscribeEventgroupAck确认消息以及对应的初始化字段。 描述 本测试用例旨在确保DUT能够正确处理SubscribeEventgroup消息,并按照消息中…

基于SpringBoot+Vue的健身房管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

自动化直播的未来:2024年必试的10款自动直播App曝光,教你轻松玩转直播!

自动化直播的未来:2024年必试的10款自动直播App曝光,教你轻松玩转直播! 随着人工智能技术的飞速发展,自动化直播已经成为当下最热门的趋势之一。2024年,众多创新的AI自动直播App如雨后春笋般涌现,它们不仅…

IO流中的异常捕获

Java简化 接口AutoCloseable

unity3d入门教程九

unity3d入门教程九 20.2播放音频20.3在代码中播放21.1延时调用21.2invoke API21.3消息调用22.1交互界面22.2添加canvas22.3canavas的位置22.4添加text 这里给一个资源网站,可以部分免费下载,音乐和音效超多,支持检索 爱给网 https://www.aige…

【Delphi】创建应用程序和 LiveBindings示例(FMX)

一、创建一个FMX程序 界面上放置上如下3个控件:TProgressBar1, TArcDial1,TTrackBar1。 二、打开LiveBindings Designer 设计器 三、在 LiveBindings Designer 中,您的绑定图只包含对象,您可以将它们连接起来。 四、在设计器中,在…

idea 恢复 pom 文件呈现灰色并带删除线

今天在 idea 中导入别人的项目时发现有几个 pom 文件是灰色的并带删除线。 可以用以下方式解决: 打开file - settings - build,execution,deployment - Build Tools - Maven - Ignored Files 把 pom.xml 前面的复选框去掉,去掉之后,点击 appl…

Kerberos自我总结Kerberos自我总结

1、协议原理与漏洞产生 1.1 kerberos Kerberos协议是一种基于票据Ticket的认证方式,它由三个角色组成,分别是客户端Client、服务端Server和秘钥分发中心KDC。 协议中的交互分为六步,为AS_REQ、AS_REP、TGS_REQ、TGS_REP、AP_REQ和AP_REP …

【Linux】进程地址空间和进程调度队列

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12625432.html 目录 问题现象 进程地址空间 进一步理解 地址空间 Linux2.6内核进程调度队列 …

C++——string的了解和使用

目录 引言 为什么要学习string 1.C语言中的字符串 2.C中的字符串 auto和范围for 1.auto 1.1 auto的介绍 1.2 注意事项 2.范围for 标准库中的string类 1.string类的迭代器 1.1 begin()与end()函数 1.2 rbegin()与rend()函数 2.string类的初始化和销毁 3.string类…

【线程】线程的控制

本文重点:理解线程控制的接口 前言 内核中是没有很明确线程的概念的,只有轻量级进程的概念,不会提供直接给我们线程的系统调用,而会给我们提供轻量级进程的系统调用。我们用户是需要线程的接口的,在应用层&#xff0…

java重点学习-总结

十五 总结 https://kdocs.cn/l/crbMWc8xEZda (总结全部的精华) 1.面试准备 企业筛选简历规则简历编写注意事项(亮点)项目怎么找,学习到什么程度面试过程(表达结构、什么样的心态去找工作) 2.redis 缓存相关(缓存击穿、穿透、雪崩、缓存过期淘…

智能自行车码表:基于2605C语音芯片的创新开发方案

一、开发背景 随着科技的飞速发展和人们对健康生活的追求,自行车骑行已成为一种广受欢迎的绿色出行方式。智能自行车码表作为骑行者的得力助手,不仅记录骑行数据,还逐渐融入了更多智能化功能。然而,传统码表在语音提示、多语种支持…

Science Robotic 内在触觉实现直观的物理人机交互

触觉传感器和电子皮肤是为机器人提供物理交互感的常见设备,但当用于机器人的大面积覆盖时,它们会变得复杂且昂贵。德国宇航中心近期发表的Science Robotics研究工作,使用内部高分辨率关节力扭矩传感器,在机械臂中实现了固有的全身…

linux网络-----传输层

前言 一.传输层: 数据要交接应用层先通过传输层(给哪个程序发数据) 传输层作用:负责数据能够从发送端传输接收端。对于应用层来说有许多服务,传输层怎么知道把数据发给那个应用服务? 这时就有了端口号&am…

BMC 虚拟i2c访问PCA9545(switch芯片)后面的设备,为什么找不到PCA9545?

1.说明 1.1 背景 无意中看到PCA9545(switch芯片)后面有设备,但是PCA9545设备本身是连接到物理设备i2c上的,然而扫描该物理i2c bus,却找不到该设备。此篇文章主要找一下该原因的。 1.2 参考代码 当前使用的是ast2600芯片,可参考…

Mudslide

作者未提供代码

Qt/C++ TCP调试助手V1.1 新增图像传输与接收功能(附发布版下载链接)

发布版本链接 通过百度网盘分享的文件:TCP调试助手V1.zip(含客户端与服务器) 链接:https://pan.baidu.com/s/14LTRPChPhYdwp_s6KeyBiA?pwdcedu 提取码:cedu 基于Qt/C实现了一款功能丰富的TCP服务器与客户端调试助手…