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

相关推荐
逸风尊者2 小时前
开发可掌握的知识:uber H3网格
后端·算法
Ada大侦探2 小时前
新手小白学习Power BI第五弹--------产品分析以及产品毛利率报表、条件式标红、饼图、散点图
学习·数据分析·powerbi
javpy2 小时前
AI生成 Python小游戏 怪物防御战???
人工智能·python·pygame
深海章鱼2 小时前
MD 基础学习2
学习·md
半问2 小时前
付费投流硬控互联网
人工智能·算法·互联网·推荐·流量
爱笑的眼睛112 小时前
超越SIFT与ORB:深入OpenCV特征检测API的设计哲学与高阶实践
java·人工智能·python·ai
西岸行者2 小时前
学习Hammerstein-Wiener 模型,以及在回声消除场景中的应用
人工智能·学习·算法
中年程序员一枚2 小时前
python开发接口uvicorn方法启动FastAPI,postman调用接口
python·postman·fastapi