5.1用栈实现队列(LC232-E)

news2024/11/27 16:53:31

算法:

这道题就是用栈模拟队列。

举个例子理解:

输入:
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]

解释:
MyQueue myQueue = new MyQueue();
//输入一个空字符串
myQueue.push(1); 
// queue is: [1]。插入队尾-1
myQueue.push(2); 
// queue is: [1, 2] 插入队尾-2
myQueue.peek(); 
// return 1。返回队首元素1
myQueue.pop();
// return 1, queue is [2]
//从队首移除元素1
myQueue.empty(); 
// return false 判断队列是否为空:非空

在出队列时,队首先出,而栈中尾部元素先出,要想实现出队列操作,需要再借助一个栈(stack_out)

出队列时,把元素按照倒序放入stack_out,再stack_out.pop

比如数组[1,2],stack_out=[2,1],这样pop的就是队首1

调试过程:

class MyQueue:

    def __init__(self):
        stack_in = []
        stack_out = []
    def push(self, x: int) -> None:
        stack_in.append.(x)

    def pop(self) -> int:
        #先判断队列是否为空
        if self.empty:
            return None
     #由于peek操作,stack_out可能有值,此时直接返回stack_out里面的值即可       
        if stack_out:
            return stack_out.pop
        else:
            for i in range(len(stack_in)):
                stack_out.append(stack_in.pop)
            return stack_out.pop

    def peek(self) -> int:
        #通过刚刚定义的pop函数从stack_out中得到队首元素的值
        first = self.pop
        #由于peek函数不改变队列,而pop把队首弹出来了,所以要把队首加回stack_out
        stack_out.append(first)
        return first

    def empty(self) -> bool:
        # stack_in和 stack_out都空,即空
        return not (stack_in and stack_out)



# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()

原因:在代码中,需要将类内部的变量 `stack_in` 和 `stack_out` 前面加上 `self.`,以表示它们是类的成员变量。另外,代码中的 `stack_in` 和 `stack_out` 是局部变量,需要改为 `self.stack_in` 和 `self.stack_out`,以正确引用类的成员变量。

而且,append函数使用不对,直接 self.stack_in.append(x)即可,append后面不要有“.”

修改后:

原因:调用函数时,应该在后面加上括号!

在代码中,`self.empty` 和 `self.empty()` 是两个不同的表达式。

  • `self.empty` 是一个属性(attribute),它是一个函数对象。在类定义中,`empty` 是一个方法(函数),通过 `self.empty` 可以访问到这个方法对象本身。这种用法通常用于在类内部进行方法的引用或传递。

  • `self.empty()` 是方法的调用(调用函数)。通过在方法名后面加上圆括号 `()`,可以执行该方法并获取方法的返回值。在这个例子中,`self.empty()` 调用了 `empty` 方法,并返回了方法的返回值(一个布尔值)。

修改后:

class MyQueue:

    def __init__(self):
        self.stack_in = []
        self.stack_out = []
    def push(self, x: int) -> None:
        
        self.stack_in.append(x)

    def pop(self) -> int:
        #先判断队列是否为空
        if self.empty():
            return None
     #由于peek操作,stack_out可能有值,此时直接返回stack_out里面的值即可       
        if self.stack_out:
            return self.stack_out.pop()
        else:
            for i in range(len(stack_in)):
                self.stack_out.append(stack_in.pop)
            return self.stack_out.pop()

    def peek(self) -> int:
        #通过刚刚定义的pop函数从stack_out中得到队首元素的值
        first = self.pop()
        #由于peek函数不改变队列,而pop把队首弹出来了,所以要把队首加回stack_out
        self.stack_out.append(first)
        return first

    def empty(self) -> bool:
        # stack_in和 stack_out都空,即空
        return not (self.stack_in and self.stack_out)



# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()

原因:之前的调用还没全改过来。empty处应该把and改成or,只要有一个非空,就非空,所以非空的逻辑是or ,空就是非空前面加 not

正确代码:

class MyQueue:

    def __init__(self):
        self.stack_in = []
        self.stack_out = []
    def push(self, x: int) -> None:
        
        self.stack_in.append(x)

    def pop(self) -> int:
        #先判断队列是否为空
        if self.empty():
            return None
     #由于peek操作,stack_out可能有值,此时直接返回stack_out里面的值即可       
        if self.stack_out:
            return self.stack_out.pop()
        else:
            for i in range(len(self.stack_in)):
                self.stack_out.append(self.stack_in.pop())
            return self.stack_out.pop()

    def peek(self) -> int:
        #通过刚刚定义的pop函数从stack_out中得到队首元素的值
        first = self.pop()
        #由于peek函数不改变队列,而pop把队首弹出来了,所以要把队首加回stack_out
        self.stack_out.append(first)
        return first

    def empty(self) -> bool:
        # stack_in和 stack_out都空,即空
        return not (self.stack_in or self.stack_out)



# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()

时间空间复杂度:

  • 时间复杂度: push和empty为O(1), pop和peek为O(n)
  • 空间复杂度: O(n)

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

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

相关文章

二叉树第i层结点个数

//二叉树第i层结点个数 int LevelNodeCount(BiTree T, int i) {if (T NULL || i < 1)return 0;if (i 1) return 1;return LevelNodeCount(T->lchild, i - 1) LevelNodeCount(T->rchild, i - 1); } int GetDepthOfBiTree(BiTree T) {if (T NULL)return 0;return Ge…

Linux - 进程控制(下篇)- 进程等待

进程等待 为什么进程需要等待&#xff1f; 我们知道&#xff0c;在Linux 当中&#xff0c;父子进程之间一些结构就是一些多叉树的结构&#xff0c;一个父进程可能管理或者创建了很多个字进程。 而其实我们在代码当中使用fork&#xff08;&#xff09;函数创建的子进程的父进程…

Paddle炼丹炉炸了Unexpected BUS error encountered in DataLoader worker

Paddle训练报错&#xff0c;内存不足 python train.py -c config/ResNet_W18.yaml修改配置文件config/ResNet_W18.yaml # 原配置 loader:num_workers: 4use_shared_memory: True# 修改后 loader:num_workers: 2use_shared_memory: False

《申论技巧》

一、做题过程 做题过程&#xff1a; 四个要素分析题干 一对多&#xff1a;考虑材料之间的灵活运用&#xff1b;问题对策&#xff1b;并列&#xff1b;主材料与辅材料 多个题目对应一个一篇材料&#xff1b;答案各有侧重&#xff0c;不重合 主体内容 二、读材料 2.1 粗读…

Makefile实例

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;…

C#中LINQtoObjects、LINQtoDataSet和LINQtoXML

目录 一、使用LINQ操作数组和集合 二、使用LINQ操作DataSet数据集 1.AsEnumerable()方法 2.CopyToDataTable()方法 3.AsDataView()方法 4.Take()方法 5.Sum()方法 6.示例 &#xff08;1&#xff09;源码 &#xff08;2&#xff09;生成效果 三、使用LINQ操作XML 1.…

立创eda专业版学习笔记(8)(运行模式)

以前没注意过这个问题&#xff0c;我有2台电脑&#xff0c;都能登录eda专业版&#xff0c;但是一台是全在线模式&#xff0c;另外一台是半离线模式&#xff0c;虽然是同一个账号&#xff0c;但是打开里面的工程会发现&#xff0c;两边的工程完全不同&#xff0c;因为一台的工程…

建模与决策

&#xff08;1&#xff09; 人们老说&#xff1a;算法、建模。但其实人们口中老说的算法、建模&#xff0c;不是真正的算法、建模&#xff0c;而是逻辑。 所以我在这里&#xff0c;对建模、模型做个定义&#xff0c;那就是&#xff1a; 一定能用数学公式进行表达、推导 而且这个…

佩戴舒适好的蓝牙耳机有哪些?五款佩戴最舒适的蓝牙耳机分享

随着骨传导耳机的普及&#xff0c;越来越多的人开始了解这种新型的耳机。相较于传统耳机&#xff0c;骨传导耳机长时间佩戴不会出现耳朵疼痛等问题&#xff0c;因此成为了很多人的首选。它不需要塞入耳道&#xff0c;避免了耳朵的闷热感&#xff0c;更能有效预防耳道感染的发生…

友提:2023年小学生古诗文大会今天(11月4日)截止,请及时参赛

根据小学生古诗文大会方案和通知&#xff0c;2023第八届上海小学生古诗文大会暨古诗文“桂冠少年”选拔活动初选答题时间为10月21日开始到11月4日结束。 即到今天晚上23点59分就结束初选答题&#xff0c;请各位家长和孩子们准时参赛&#xff0c;必要的时候设置闹钟。 一、如何…

基于Python+Networkx的最短路径

networkx是一个用Python语言开发的图论与复杂网络建模工具&#xff0c;内置了常用的图与复杂网络分析算法&#xff0c;可以方便的进行复杂网络数据分析、仿真建模等工作。利用networkx可以以标准化和非标准化的数据格式存储网络、生成多种随机网络和经典网络、分析网络结构、建…

3+单细胞+代谢+WGCNA+机器学习

今天给同学们分享一篇生信文章“Identification of new co-diagnostic genes for sepsis and metabolic syndrome using single-cell data analysis and machine learning algorithms”&#xff0c;这篇文章发表Front Genet.期刊上&#xff0c;影响因子为3.7。 结果解读&#x…

xilinx fpga ddr mig axi

硬件 参考&#xff1a; https://zhuanlan.zhihu.com/p/97491454 https://blog.csdn.net/qq_22222449/article/details/106492469 https://zhuanlan.zhihu.com/p/26327347 https://zhuanlan.zhihu.com/p/582524766 包括野火、正点原子的资料 一片内存是 1Gbit 128MByte 16bit …

【教3妹学编程-算法题】数组中两个数的最大异或值

3妹&#xff1a;“太阳当空照&#xff0c;花儿对我笑&#xff0c;小鸟说早早早&#xff0c;你为什么背上炸药包” 2哥 :3妹&#xff0c;什么事呀这么开心呀。 3妹&#xff1a;2哥你看今天的天气多好啊&#xff0c;阳光明媚、万里无云、秋高气爽&#xff0c;适合秋游。 2哥&…

成人编程先学什么?成人编程一般要学几年

成人编程先学什么&#xff1f;成人编程一般要学几年 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&#xff0c;向如图这个实例就是用这个…

【操作系统】多线程同步与互斥

文章目录 一. 实验目的二. 实验内容三. 实验步骤四. 实验结果五. 实验总结 一. 实验目的 &#xff08;1&#xff09;加强对进程同步和互斥的理解&#xff0c;学会使用信号量解决资源共享问题。 &#xff08;2&#xff09;熟悉Linux 进程同步原语。 &#xff08;3&#xff09;掌…

第8章_聚合函数

文章目录 1 聚合函数介绍1.1 AVG和SUM函数1.2 MIN和Max函数1.3 COUNT函数演示代码 2 GROUP BY2.1 基本使用2.2 使用多个列分组2.3 演示代码 3 HAVING3.1 基本使用3.2 WHERE和HAVING的对比3.3 演示代码 4 SELECT的执行过程4.1 查询的结构4.2 SELECT执行顺序4.3 SQL的执行原理演示…

前K个高频单词(Java详解)

一、题目描述 给定一个单词列表 words 和一个整数 k &#xff0c;返回前 k 个出现次数最多的单词。 返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率&#xff0c; 按字典顺序 排序。 示例1&#xff1a; 输入: words ["i", "love&…

curl(四)证书相关

一 证书相关 ① -k 1、客户端忽略服务端证书校验 -k | --insecure --> 单向[1]、这个选项显式地允许curl 执行不安全 的SSL连接和传输[2]、所有SSL连接都试图通过使用默认安装的CA证书捆绑包来确保安全[3]、这使得所有被认为是不安全的连接失败,除非使用-k --> 自签…

Android logd日志简介及典型案例分析

在程序开发过程中&#xff0c;日志打印属于最普遍的操作&#xff0c;是代码调试和验证过程必不可少的手段。在Android开发过程中&#xff0c;我们经常通过Log\Slog等方式写入日志&#xff0c;然后通过对应的logcat命令读取相应的日志信息。具体日志如何写入或者读出&#xff0c…