代码随想录算法训练营Day9 | 232.用栈实现队列,225. 用队列实现栈,20. 有效的括号,1047. 删除字符串中的所有相邻重复项

第五章 栈与队列part01

理论基础 

了解一下 栈与队列的内部实现机制,文中是以C++为例讲解的。 

文章讲解:代码随想录

232.用栈实现队列 ✅

大家可以先看视频,了解一下模拟的过程,然后写代码会轻松很多。

题目链接/文章讲解/视频讲解:代码随想录

# 232
class MyQueue(object):

    def __init__(self):
        self.stackIn = []
        self.stackOut = []


    def push(self, x):
        """
        :type x: int
        :rtype: None
        """
        self.stackIn.append(x)


    def pop(self):
        """
        :rtype: int
        """
        if not self.stackOut: #如果Out是空的
            while self.stackIn:
                self.stackOut.append(self.stackIn.pop())
        return self.stackOut.pop() if self.stackOut else None


    def peek(self):
        """
        :rtype: int
        """
        ans = self.pop() # 复用代码!!直接调用!
        self.stackOut.append(ans)
        return ans



    def empty(self):
        """
        :rtype: bool
        """
        return not self.stackIn and not self.stackOut



# 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()

225. 用队列实现栈 ✅

可能大家惯性思维,以为还要两个队列来模拟栈,其实只用一个队列就可以模拟栈了。 

建议大家掌握一个队列的方法,更简单一些,可以先看视频讲解

题目链接/文章讲解/视频讲解:代码随想录

# 225
class MyStack(object):

    def __init__(self):
        self.que = deque()

    def push(self, x):
        self.que.append(x)

    def pop(self):
        if self.empty():
            return None
        for i in range(len(self.que)-1):
            self.que.append(self.que.popleft())
        return self.que.popleft()

    def top(self):
        temp = self.pop()
        self.que.append(temp)
        return temp

    def empty(self):
        return not self.que
# 225
# 这题不能用双端队列的!对列定义就是一端进一端出 这里就是熟悉一下别的用法
class MyStack(object):

    def __init__(self):
        self.que = deque()

    def push(self, x):
        self.que.append(x)

    def pop(self):
        if self.empty():
            return None
        return self.que.pop() 

    def top(self):
        return self.que[-1]

    def empty(self):
        return not self.que

20. 有效的括号 ✅

讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。 

大家先自己思考一下 有哪些不匹配的场景,在看视频 我讲的都有哪些场景,落实到代码其实就容易很多了。

题目链接/文章讲解/视频讲解:代码随想录

# 20
class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        stack = []
        if len(s) % 2 == 1:
            return False
        else:
            for _ in s:
                if _ == '[': stack.append(']')
                elif _ == '(': stack.append(')')
                elif _ == '{': stack.append('}')
                elif not stack or _ != stack[-1]:
                    return False
                else: stack.pop()
        return True if not stack else False

1047. 删除字符串中的所有相邻重复项 ✅

栈的经典应用。 

要知道栈为什么适合做这种类似于爱消除的操作,因为栈帮助我们记录了 遍历数组当前元素时候,前一个元素是什么。

题目链接/文章讲解/视频讲解:代码随想录

# 1047
class Solution(object):
    def removeDuplicates(self, s):
        """
        :type s: str
        :rtype: str
        """
        stack = []
        for _ in s:
            if not stack or stack[-1] != _:
                stack.append(_)
            else:
                stack.pop()
        return ''.join(stack)

总结

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第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 ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值