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

相关推荐
Tisfy10 小时前
LeetCode 3507.移除最小数对使数组有序 I:纯模拟
算法·leetcode·题解·模拟·数组
努力学算法的蒟蒻10 小时前
day63(1.22)——leetcode面试经典150
算法·leetcode·面试
jrlong10 小时前
DataWhale大模型基础与量化微调task4学习笔记(第 1章:参数高效微调_PEFT技术综述)
笔记·学习
invicinble10 小时前
对于后端要和linux打交道要掌握的点
linux·运维·python
leiming610 小时前
linux 进程学习之信号
linux·运维·学习
喵手10 小时前
Python爬虫零基础入门【第三章:Requests 静态爬取入门·第4节】列表页→详情页:两段式采集(90%项目都这样)!
爬虫·python·python爬虫实战·python爬虫工程化实战·python爬虫零基础入门·requests静态爬取·两段式采集
zzZ··*10 小时前
自动登录上海大学校园
python·网络协议·selenium
weisian15110 小时前
进阶篇-4-数学篇-3--深度解析AI中的向量概念:从生活到代码,一文吃透核心逻辑
人工智能·python·生活·向量
写代码的【黑咖啡】10 小时前
Python中的Msgpack:高效二进制序列化库
开发语言·python
MistaCloud10 小时前
Pytorch进阶训练技巧(二)之梯度层面的优化策略
人工智能·pytorch·python·深度学习