【20250211】栈与队列:225.用队列实现栈

# class MyStack:

#     def __init__(self):

#         #deque是双端队列,左侧是先进的,popleft就是先入先出,pop就是后入先出

#         self.que = deque()

#     def push(self, x):

#         self.que.append(x)

#     def pop(self):

#         if self.empty():

#             return None

#         #把前len(self.que)-1的数据都加到后面去,露出最后一个数据再弹出

#         for i in range(len(self.que)-1):

#             self.que.append(self.que.popleft())

#         return self.que.popleft()

#     #top就是获取最前面的数据但是不能弹除

#     def top(self):

#         # 写法一:

#         # if self.empty():

#         #     return None

#         # return self.que[-1]

#         # 写法二:

#         if self.empty():

#             return None

#         for i in range(len(self.que)-1):

#             self.que.append(self.que.popleft())

#         temp = self.que.popleft()

#         self.que.append(temp)

#         return temp

#     def empty(self):

#         return not self.que      

#方法一:使用单个队列

# class MyStack:

#     def __init__(self):

#         self.deq=deque()

#     def push(self,x):

#         self.deq.append(x)

#     def pop(self):

#         if self.empty():

#             return False

#         else:

#             for i in range(len(self.deq)-1):

#                 self.deq.append(self.deq.popleft())

#             return self.deq.popleft()

#     def top(self):

#         if self.empty():

#             return False

#         else:

#             for i in range(len(self.deq)-1):

#                 self.deq.append(self.deq.popleft())

#             temp=self.deq.popleft()

#             self.deq.append(temp)

#             return temp

#     def empty(self):

#         return not self.deq

       

#方法二:使用双队列  这种方法与第一种方法大同小异,都是把前len(deq)-1给存下来,一个是用自己存,另一个是用第二个队列存

from collections import deque

class MyStack:

    def __init__(self):

        # Python普通的Queue或SimpleQueue没有类似于peek的功能

        # 也无法用索引访问,在实现top的时候较为困难。

        # 用list可以,但是在使用pop(0)的时候时间复杂度为O(n)

        # 因此这里使用双向队列,我们保证只执行popleft()和append(),因为deque可以用索引访问,可以实现和peek相似的功能

        # in - 存所有数据

        # out - 仅在pop的时候会用到

        self.queue_in = deque()

        self.queue_out = deque()

    def push(self, x):

        # 直接append即可

        self.queue_in.append(x)

    def pop(self):

        # 1. 首先确认不空

        # 2. 因为队列的特殊性,FIFO,所以我们只有在pop()的时候才会使用queue_out

        # 3. 先把queue_in中的所有元素(除了最后一个),依次出列放进queue_out

        # 4. 交换in和out,此时out里只有一个元素

        # 5. 把out中的pop出来,即是原队列的最后一个

       

        # tip:这不能像栈实现队列一样,因为另一个queue也是FIFO,如果执行pop()它不能像

        # stack一样从另一个pop(),所以干脆in只用来存数据,pop()的时候两个进行交换

        if self.empty():

            return None

        for i in range(len(self.queue_in) - 1):

            self.queue_out.append(self.queue_in.popleft())      

        self.queue_in, self.queue_out = self.queue_out, self.queue_in    # 交换in和out,这也是为啥in只用来存

        return self.queue_out.popleft()

    def top(self):

        # 写法一:

        # 1. 首先确认不空

        # 2. 我们仅有in会存放数据,所以返回第一个即可(这里实际上用到了栈)

        # 写法二:

        # 1. 首先确认不空

        # 2. 因为队列的特殊性,FIFO,所以我们只有在pop()的时候才会使用queue_out

        # 3. 先把queue_in中的所有元素(除了最后一个),依次出列放进queue_out

        # 4. 交换in和out,此时out里只有一个元素

        # 5. 把out中的pop出来,即是原队列的最后一个,并使用temp变量暂存

        # 6. 把temp追加到queue_in的末尾

        # 写法一:

        # if self.empty():

        #     return None    

        # return self.queue_in[-1]    # 这里实际上用到了栈,因为直接获取了queue_in的末尾元素

        # 写法二:

        if self.empty():

            return None

        for i in range(len(self.queue_in) - 1):

            self.queue_out.append(self.queue_in.popleft())

        self.queue_in, self.queue_out = self.queue_out, self.queue_in

        temp = self.queue_out.popleft()  

        self.queue_in.append(temp)

        return temp

    def empty(self):

        #因为只有in存了数据,只要判断in是不是有数即可

        return len(self.queue_in) == 0


 

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

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

相关文章

【详细版】DETR系列之Deformable DETR(2021 ICLR)

论文标题Deformable DETR: Deformable Transformers for End-to-End Object Detection论文作者Xizhou Zhu, Weijie Su, Lewei Lu, Bin Li, Xiaogang Wang, Jifeng Dai发表日期2021年03月01日GB引用> Xizhou Zhu, Weijie Su, Lewei Lu, et al. Deformable DETR: Deformable T…

从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势

作者:谢吉宝(唐三) 编者按: 云原生 API 网关系列教程即将推出,欢迎文末查看教程内容。本文整理自阿里云智能集团资深技术专家,云原生产品线中间件负责人谢吉宝(唐三) 在云栖大会的精…

基于机器学习时序库pmdarima实现时序预测

目录 一、Pmdarima实现单变量序列预测1.1 核心功能与特性1.2 技术优势对比1.3 python案例1.3.1 时间序列交叉验证1.3.1.1 滚动交叉验证1.3.1.2 滑窗交叉验证 时间序列相关参考文章: 时间序列预测算法—ARIMA 基于VARMAX模型的多变量时序数据预测 基于机器学习时序库…

【文本处理】如何在批量WORD和txt文本提取手机号码,固话号码,提取邮箱,删除中文,删除英文,提取车牌号等等一些文本提取固定格式的操作,基于WPF的解决方案

企业的应用场景 数据清洗:在进行数据导入或分析之前,往往需要对大量文本数据进行预处理,比如去除文本中的无关字符(中文、英文),只保留需要的联系信息(手机号码、固话号码、邮箱)。…

小游戏源码开发之可跨app软件对接是如何设计和开发的

专业小游戏开发的团队往往会面临跨领域和不同平台客户需要追加同一款游戏的需求,所以就要设计和开发一款可任意对接不同 App 软件的小游戏,那么针对这类需求小游戏开发团队早已有了成熟的解决方案,针对设计和开发可跨平台游戏对接大概流程简单…

C# Winform 使用委托实现C++中回调函数的功能

C# Winform 使用委托实现C中回调函数的功能 在项目中遇到了使用C#调用C封装的接口,其中C接口有一个回调函数的参数。参考对比后,在C#中是使用委托(delegate)来实现类似的功能。 下面使用一个示例来介绍具体的使用方式: 第一步:…

从基础到人脸识别与目标检测

前言 从本文开始,我们将开始学习ROS机器视觉处理,刚开始先学习一部分外围的知识,为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本,系统采用Ubuntu20.04,ROS采用noetic。 颜…

未来替代手机的产品,而非手机的本身

替代手机的产品包括以下几种: 可穿戴设备:智能手表、智能眼镜等可穿戴设备可以提供类似手机的功能,如通话、信息推送、浏览网页等。 虚拟现实(VR)技术:通过佩戴VR头显,用户可以进行语音通话、发…

QTreeView和QTableView单元格添加超链接

QTreeView和QTableView单元格添加超链接的方法类似,本文仅以QTreeView为例。 在QTableView仿Excel表头排序和筛选中已经实现了超链接的添加,但是需要借助delegate,这里介绍一种更简单的方式,无需借助delegate。 一.效果 二.实现 QHTreeView.h #ifndef QHTREEVIEW_H #def…

正则引入store中的modules文件

正则引入store中的modules文件 // index.js import { createStore } from vuex;const modulesFiles require.context(./modules, true, /\.ts|js$/); const modules modulesFiles.keys().reduce((modules1, modulePath) > {const moduleName modulePath.replace(/^\.\/(.…

如何保证Redis和MySQL数据的一致性刨析

1、常见的缓存更新策略: 定义:主要用来进行redis和mysql的数据同步更新的一些策略 内存淘汰:等触发淘汰机制后,刚好淘汰到了用户查询的数据,此时是null,会进行查询数据库并写入到缓存中,此时…

产品详情页中 品牌官网详情 对应后端的字段是 detail

文章目录 1、在这个Vue代码中,品牌官网详情 对应后端的字段是 detail2、品牌官网详情 功能相关的代码片段3、export const productSave (data: any) >4、ProductController5、ProductDto 类6、ProductApiService 1、在这个Vue代码中,品牌官网详情 对…

使用C语言实现MySQL数据库的增删改查操作指南

使用C语言与MySQL数据库进行交互,通常涉及使用MySQL提供的C API库。这套API允许开发者在C/C++程序中执行SQL查询,从而实现数据库的增删改查操作。下面,我将详细介绍如何在C语言中实现这些基本操作。 准备工作 安装MySQL开发库:确保你的系统上安装了MySQL服务器以及MySQL开发…

【蓝桥杯嵌入式】2_LED

全部代码网盘自取 链接:https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码:3ii2 1、电路图 74HC573是八位锁存器,当控制端LE脚为高电平时,芯片“导通”,LE为低电平时芯片“截止”即将输出状态“锁存”…

计算机视觉常用数据集Cityscapes的介绍、下载、转为YOLO格式进行训练

我在寻找Cityscapes数据集的时候花了一番功夫,因为官网下载需要用公司或学校邮箱邮箱注册账号,等待审核通过后才能进行下载数据集。并且一开始我也并不了解Cityscapes的格式和内容是什么样的,现在我弄明白后写下这篇文章,用于记录…

MariaDB MaxScale实现mysql8主从同步读写分离

一、MaxScale基本介绍 MaxScale是maridb开发的一个mysql数据中间件,其配置简单,能够实现读写分离,并且可以根据主从状态实现写库的自动切换,对多个从服务器能实现负载均衡。 二、MaxScale实验环境 中间件192.168.121.51MaxScale…

Python设计模式 - 原型模式

定义 原型模式是一种创建型设计模式,它可以通过复制现有对象来创建新对象,而不是直接实例化新的对象。 结构 抽象原型(Prototype):声明 clone() 方法,以便派生类实现克隆自身的能力。具体原型&#xff08…

GWO优化决策树回归预测matlab

灰狼优化算法(Grey Wolf Optimizer,简称 GWO)是一种群智能优化算法,由澳大利亚格里菲斯大学的 Mirjalii 等人于 2014 年提出。该算法的设计灵感源自灰狼群体的捕食行为,核心思想是模仿灰狼社会的结构与行为模式。 在本…

Oracle的学习心得和知识总结(三十三)|Oracle数据库数据库的SQL ID的底层计算原理分析

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《Oracle Database SQL Language Reference》 2、参考书籍:《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

Git(分布式版本控制系统)系统学习笔记【并利用腾讯云的CODING和Windows上的Git工具来实操】

Git的概要介绍 1️⃣ Git 是什么? Git 是一个 分布式版本控制系统(DVCS),用于跟踪代码的变更、协作开发和管理项目历史。 由 Linus Torvalds(Linux 之父)在 2005 年开发,主要用于 代码管理。…