更弱智的算法学习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之外),这里更多的是想清楚思路做题,期待

相关推荐
じ☆冷颜〃1 小时前
分布式系统中网络技术的演进与异构融合架构(HFNA)
笔记·python·物联网·设计模式·架构·云计算
夜思红尘4 小时前
算法--双指针
python·算法·剪枝
人工智能训练4 小时前
OpenEnler等Linux系统中安装git工具的方法
linux·运维·服务器·git·vscode·python·ubuntu
散峰而望4 小时前
【算法竞赛】C++函数详解:从定义、调用到高级用法
c语言·开发语言·数据结构·c++·算法·github
CoderCodingNo4 小时前
【GESP】C++五级真题(贪心思想考点) luogu-B4071 [GESP202412 五级] 武器强化
开发语言·c++·算法
我有一些感想……4 小时前
An abstract way to solve Luogu P1001
c++·算法·ai·洛谷·mlp
前端小L5 小时前
双指针专题(三):去重的艺术——「三数之和」
javascript·算法·双指针与滑动窗口
智航GIS5 小时前
8.2 面向对象
开发语言·python
小小星球之旅5 小时前
CompletableFuture学习
java·开发语言·学习
盐焗西兰花5 小时前
鸿蒙学习实战之路-ArkTS循环渲染_ForEach使用指南
学习·华为·harmonyos