栈与队列part02(24.01.06)
安排:先独立做题,然后看视频讲解,然后看文章讲解,然后再重新做一遍题,把题目AC,最后整理成今日当天的博客。
- 学习时长:2h
- 学习内容:自己尝试+pdf说明+视频+力扣题解+自己默写
- 学习感悟:用栈解题的思路好好玩啊也很好理解,明白基本原理去pdf里看相应语言的代码实现即可,每天解决任务的速度越来越快了!
20. 有效的括号
题目链接:力扣题目链接
笔记:
1.不匹配类型只有三种:左括号多了(遍历完了但栈非空),左右括号类型不匹配(匹配过程中发现和栈中弹出元素不同),右括号多了(还没遍历完但栈空了)
2.遍历,遇左括号进栈,遇右括号弹出比较。注意进栈时放相应类型的右括号,方便后续弹出直接比较。
提交代码:
class Solution:
def isValid(self, s: str) -> bool:
stack = []
for item in s:
if item == '[':
stack.append(']')
elif item == '(':
stack.append(')')
elif item == '{':
stack.append('}')
elif not stack or stack[-1] != item: #对应右括号多了或者左右不匹配
return False
else:
stack.pop()
return True if not stack else False #对应左括号多了
1047. 删除字符串中的所有相邻重复项
题目链接:力扣题目链接
笔记:
类似上一题的思路,利用栈做一个对比消除的操作。但具体来讲不是使用栈,而是使用一个列表来模拟栈的操作。由于字符串不能直接处理,我们利用列表进行拼接。
提交代码:
class Solution:
def removeDuplicates(self, s: str) -> str:
res = list()
for item in s:
if res and item == res[-1]:
res.pop()
else:
res.append(item)
return "".join(res)
150. 逆波兰表达式求值
题目链接:力扣题目链接
笔记:
1.逆波兰表达式:是一种后缀表达式,所谓后缀就是指运算符写在后面。平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。
2.逆波兰表达式主要有以下两个优点:
-
去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
-
适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。
3.解题思路其实就是:遍历到数字就把它放入栈中,遍历到符号就从栈中拿出两个数字进行对应的符号运算,得到的新的数字放入栈中,继续遍历,直到遍历结束。
4.下面这段代码创建了一个字典 op_map
,其中包含四个键值对,每个键表示一个运算符,而对应的值则是一个函数或 lambda 表达式。这样的设计通常用于实现一个简单的计算器,可以根据给定的运算符执行相应的操作。其中:'/
': 对应一个匿名的 lambda 表达式,表示除法操作。这个 lambda 表达式接受两个参数 x
和 y
,执行的操作是返回 x / y
的整数部分,即整数除法。
op_map = {'+': add, '-': sub, '*': mul, '/': lambda x, y: int(x / y)}
提交代码:
from operator import add, sub ,mul
class Solution:
opt_map = {'+':add,'-':sub,'*':mul,'/':lambda x,y :int(x/y)}
def evalRPN(self, tokens: List[str]) -> int:
stack = []
for token in tokens:
if token not in {'+','-','*','/'}:
stack.append(int(token))
else:
opt2 = stack.pop()
opt1 = stack.pop()
stack.append(self.opt_map[token](opt1,opt2))
return stack.pop()
过程中报错:
1.输入stack.append(opt_map[token](opt1,opt2))时会报错:NameError: name 'opt_map' is not defined 。解决办法是修正为:stack.append(self.opt_map[token](opt1,opt2))
2.输入if token not in {'+','-','*','/'}:stack.append(token)会报错:TypeError: can't multiply sequence by non-int of type 'str';这是因为字符串之间无法进行运算,这个错误通常发生在尝试用一个字符串(str)去乘以非整数类型的对象时。在 Python 中,你只能将字符串与整数相乘,表示重复字符串多次。 解决办法是修正为:stack.append(int(token))