代码随想录算法训练营day10 | 232.用栈实现队列、225. 用队列实现栈

栈与队列part01(24.01.05)

安排:先独立做题,然后看视频讲解,然后看文章讲解,然后再重新做一遍题,把题目AC,最后整理成今日当天的博客。


  • 学习时长:2h
  • 学习内容:自己尝试+pdf说明+视频+力扣题解+自己默写
  • 学习感悟:早点开始 别拖延!

栈与队列理论基础

文章链接:代码随想录 (programmercarl.com)

队列是先进先出,栈是先进后出。(感觉队列的进出方向好像应该是从右到左的,即左边是队头右边是队尾)


232.用栈实现队列

题目链接:力扣题目链接

笔记:

        1.思路是:「输入栈」会把输入顺序颠倒;如果把「输入栈」的元素逐个弹出放到「输出栈」,再从「输出栈」弹出元素的时候,则可以负负得正,实现了先进先出。

        具体做法:

        可以把一个栈当做「输入栈」,把另一个栈当做「输出栈」。
        当 push() 新元素的时候,放到「输入栈」的栈顶,记此顺序为「输入序」。
        当 pop() 元素的时候,是从「输出栈」弹出元素。如果「输出栈」为空,则把「输入栈」的元素逐个 pop() 并且 push() 到「输出栈」中,这一步会把「输入栈」的栈底元素放到了「输出栈」的栈顶。此时负负得正,从「输出栈」的 pop() 元素的顺序与「输入序」相同。

        2.not self.stack1:这部分检查 self.stack1 是否为空。如果 self.stack1 为空,not self.stack1 就为 True;否则,为 Falsenot self.stack2:这部分检查 self.stack2 是否为空。如果 self.stack2 为空,not self.stack2 就为 True;否则,为 False

      整个表达式使用 and 运算符连接两个条件,表示只有当两个条件都为 True 时,整个表达式才为 True。因此,如果 self.stack1self.stack2 都为空,整个表达式的结果就是 True,否则为 False

      这样的表达式通常用于判断两个数据结构是否同时为空。

提交代码:

class MyQueue:

    def __init__(self):
        self.stack1 = []
        self.stack2 = []


    def push(self, x: int) -> None:
        self.stack1.append(x)


    def pop(self) -> int:
        if  not self.stack2:
            while self.stack1:
                self.stack2.append(self.stack1.pop())
        return self.stack2.pop()


    def peek(self) -> int:
        if not self.stack2:
            while self.stack1:
                self.stack2.append(self.stack1.pop())
        return self.stack2[-1]


    def empty(self) -> bool:
        return not self.stack1 and not self.stack2

225. 用队列实现栈

题目链接:力扣题目链接

总体思路:

笔记: 

      1.collections.deque(双端队列)是 Python 标准库中 collections 模块提供的一种数据结构。Deque 是一个双向队列,支持在两端进行高效的 O(1) 时间复杂度的操作,包括元素的添加、删除和查看。这与列表(List)相比,deque 在队头和队尾执行的操作更为高效。

        2.这行代码的作用是将self.popQueue队列的左端(队头)元素取出,并追加到self.pushQueue队列的右端(队尾)。

self.pushQueue.append(self.popQueue.popleft())

        3.self.popQueue.popleft():这是collections.deque提供的方法,用于从队列的左端弹出一个元素。

提交代码:

        

class MyStack:

    def __init__(self):
        self.pushQueue = collections.deque()
        self.popQueue = collections.deque()


    def push(self, x: int) -> None:
        self.pushQueue.append(x)
        while self.popQueue:
            self.pushQueue.append(self.popQueue.popleft())  # popQueue删除全部元素(通过头部元素),pushQueue按顺序加上全部元素
        self.pushQueue, self.popQueue = self.popQueue, self.pushQueue


    def pop(self) -> int:
        return self.popQueue.popleft()


    def top(self) -> int:
        return self.popQueue[0]


    def empty(self) -> bool:
        return not self.popQueue

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值