更弱智的算法学习day 10

第五章 栈与队列part01

理论基础

python中栈与队列的操作由列表和collections库中的deque实现

232.用栈实现队列

感觉都是列表实现栈和队列,操作还是列表的操作

push函数:将一个元素x添加到队尾。这里用列表的append扩展一个元素到尾部

pop函数:从队列开头移除并返回元素。首先考虑是否有元素,也即队列是否空。这里用了两个栈实现队列,stack1用来push新的元素,当需要一处队列开头的元素时,对stack1的所有元素进行pop(),并将这些元素append到stack2中,这样顺序回复,去除第一个元素即可。

peek函数,类似的思路,结束之后返回列表的最后一个元素,也即-1

判断队列为空,看stack1和stack2

python 复制代码
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:
        if not self.stack1 and not self.stack2:
            return True
        else:
            return False

        


# 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. 用队列实现栈

push函数:将一个元素x添加到队尾。这里用列表的append扩展一个元素到尾部

pop函数:从队列开头移除并返回元素。首先考虑是否有元素,也即队列是否空。这里用了一个队列实现栈,也即从头部pop出length-1个数到队列尾部,这样之前的尾部就成为了头部。

peek函数,类似的思路,结束之后返回列表的最后一个元素,也即-1

判断队列为空

python 复制代码
class MyStack:

    def __init__(self):
        self.queue = []

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

    def pop(self) -> int:
        if self.queue is None:
            return False
        else:
            length = len(self.queue)
            for i in range(length):
                self.queue.append(self.queue.pop())
        return self.queue.pop()
            

    def top(self) -> int:
        if self.queue is None:
            return False
        else:
            length = len(self.queue)
            for i in range(length):
                self.queue.append(self.queue.pop())
        return self.queue[-1]

    def empty(self) -> bool:
        if self.queue:
            return False
        else:
            return True


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

20. 有效的括号

对称的思路,每传进来一个左括号,就向栈里面添加一个右括号,如果传进的不是左括号,就拿栈中第一个元素比较,相同即消去,不相同说明出错了。

这里要想好无效字符串的情况:

多一个会错,也即最后栈空了而字符串没有遍历完 ({}))

少一个会错,也即遍历完字符串栈还不空 ({}

不匹配也会错,也及判断条件 ({)}

python 复制代码
class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        for i in range(len(s)):
            if s[i] == '(':
                stack.append(')')
            elif s[i] == '[':
                stack.append(']')
            elif s[i] =='{':
                stack.append('}')    
            else:
                if s[i] == stack[-1]:
                    stack.pop()
                else:
                    return False
        if stack:
            return False
        else:
            return True

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

对称的思路,每传进来一个字母a,就向栈里面添加一个相同字母a,每传进一个字母,就拿栈中第一个元素比较,相同即消去,不相同说明出错了。

python 复制代码
class Solution:
    def removeDuplicates(self, s: str) -> str:
        stack = []
        for i in range(len(s)):
            if stack and s[i] == stack[-1]:
                stack.pop()
            else:
                stack.append(s[i])
        return ''.join(stack)

总结

python里栈和队列似乎都没有具体的实现(collections.deque之外),这里更多的是想清楚思路做题,期待

相关推荐
董董灿是个攻城狮7 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
IVEN_14 小时前
只会Python皮毛?深入理解这几点,轻松进阶全栈开发
python·全栈
AI软著研究员14 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish14 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
Ray Liang15 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
颜酱15 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
AI攻城狮15 小时前
如何给 AI Agent 做"断舍离":OpenClaw Session 自动清理实践
python
千寻girling16 小时前
一份不可多得的 《 Python 》语言教程
人工智能·后端·python
AI攻城狮19 小时前
用 Playwright 实现博客一键发布到稀土掘金
python·自动化运维