首页 > 编程语言 >Python中的魔法:栈与队列的奇妙之旅

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

时间:2024-09-20 12:50:14浏览次数:11  
标签:Python self 魔法 queue 队列 print history browser

引言

在软件开发过程中,我们常常需要处理大量的数据,并以特定的方式组织这些数据以便于后续的操作。例如,在浏览器的历史记录管理、函数调用的过程控制、打印机的任务调度等场景下,栈与队列便大显身手。栈遵循后进先出(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)提供了对两端进行操作的支持;优先级队列则允许根据元素的优先级进行排序。此外,还有诸如链表实现的栈与队列等变种形式,它们各自具有不同的优缺点,在选择使用时需根据具体需求灵活决定。

标签:Python,self,魔法,queue,队列,print,history,browser
From: https://blog.csdn.net/qq_44771627/article/details/142381817

相关文章

  • Python学习:range、xrange和arange的区别
    range生成左闭右开区间的整数。例子见下:np.arange生成左闭右开区间内的小数。例子见下:range和xrange有版本区别(这部分转载):Python3range()函数返回的是一个可迭代对象(类型是对象),而不是列表类型,所以打印的时候不会打印列表。Python3list()函数是对象迭代器,可以把ra......
  • 计算机毕业设计推荐-基于python+Django的学生签到考勤管理系统【源码+文档+讲解】
    精彩专栏推荐订阅:在下方主页......
  • Python面向对象编程
    Python-面向对象:类、对象、属性、方法面向对象概念面向对象编程(Object-orientedProgramming,简称OOP),是一种封装代码的方法面向对象:将模拟真实世界里的事物(对象)和描述其特征(属性)的数据和函数代码块(方法)封装到一起(类)类:可以理解是一个模板,通过它可以创建出无数个具体实例对象:类并......
  • python 比较两个或多个时间,获取最大的时间(最近的时间)
    自定义的公共函数importdate_timedefstr2datetime(date_time,form="%Y-%m-%d%H:%M:%S"):_datetime=datetime.datetime.strptime(date_time,form)ifisinstance(date_time,str)elsedate_timereturn_datetimedefdatetime2str(date_time,form=&q......
  • Python开发深度学习常见安装包 error 解决
    PythonPython是一种广泛使用的高级编程语言,它以其清晰的语法和代码可读性而闻名。Python支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。由于其简洁性和强大的标准库,Python成为了数据科学、机器学习、网络开发、自动化脚本、科学计算和教育等领域的首选语......
  • Python编程 - 协程
    前言上篇文章主要讲述了python的进程,进程池和进程与线程对比等知识,接下来这篇文章再唠唠python的协程,让我们继续往下看!一、协程的使用python中的协程是一种用于处理并发任务的高效工具,它依赖于asyncio库以及async和await关键字来实现异步编程。协程与传统的多线程或......
  • python, Pycharm开发环境配置!
    1.windows官网下载地址windowspythonDownloadwindowpycharmDownload专业版30天试用,可以下载社区版2.先下载安装python64,32位都可,一般现在都是64位双击安装,勾选Addpython.exetoPATH中如果想自定义安装,点击Customizeinstallation自定义安装,......
  • Linux | 进程间通信:管道、消息队列、共享内存与信号量
    文章目录《深入理解进程间通信:管道、消息队列、共享内存与信号量》一、进程间通信介绍(一)进程间通信目的(二)进程间通信发展(三)进程间通信分类二、管道(一)什么是管道(二)匿名管道(三)管道特点(四)命名管道三、共享内存(一)共享内存简介(二)共享内存数据结构(三)共享内存函数四、消息队......
  • 掌握Python虚拟环境:隔离项目依赖,提升开发效率的必备指南
    虚拟环境是什么?        虚拟环境是Python中的一个概念,它允许开发者在一个隔离的环境中安装和使用Python包。每个虚拟环境都是一个独立的目录,其中包含特定版本的Python解释器和一系列独立的Python包。我们可以为每个项目创建一个虚拟环境,并为该环境安装所需的特定版......
  • 使用pyenv和venv管理python环境
    1.pyenv与venv的关系pyenv是一个用于管理多个Python版本的工具,主要专注于解决不同项目需要不同Python版本的问题。venv是Python内置的虚拟环境管理工具,主要用于创建隔离的Python环境,帮助避免在不同项目之间发生包依赖冲突。总结:pyenv用于安装Python的多个版本,venv用于隔离......