今日第一题:
20. Valid Parentheses
栈的经典应用:
括号匹配
- Open brackets must be closed by the same type of brackets.
- Open brackets must be closed in the correct order.
- Every close bracket has a corresponding open bracket of the same type.
1)数量要匹配
2)类型要匹配
3)顺序要匹配
重点⚠️ 如果遇到(就要放进),要放进对应的符号
s = "()[]{}"
len(s) % 2
##剪枝--如果字符串是奇数,那么一定是有不匹配的情况
if (len(s)%2 !=0):
print(False)
stack = []
for item in s:
if item == '(':
stack.append(')')
elif item == '[':
stack.append(']')
elif item == '{':
stack.append('}')
elif not stack or stack[-1]!=item:
print(False)
"""1、not stack:这个条件检查栈是否为空。如果栈为空,表示前面没有遇到匹配的开括号,
而当前的 item 是一个闭括号,这时候无法找到与之匹配的开括号,所以字符串 s 不是有效的括号序列。
2、stack[-1] != item:这个条件检查栈顶的开括号是否与当前的 item 匹配。
如果它们不匹配,说明当前的 item 不是与栈顶的开括号相匹配的闭括号,同样表示字符串 s 不是有效的括号序列。"""
else:
stack.pop()
return True if not stack else False
## 根据 stack 是否为空来决定返回 True 或 False。
今日第二题:
1047. Remove All Adjacent Duplicates In String
重点:可以把字符串逆转来添加
s = "abbaca"
## 使用栈
stack = [] #但是为啥不用这个
res = list()
for item in s:
if res and res[-1] == item:
res.pop()
print(res)
else:
res.append(item)
print(res)
print ("".join(res)) #字符串拼接
# for item in s:
# if not stack:
# stack.append(item)
# if stack[-1] == item:
# stack.pop(item)
# else:
# stack.append(item)
# print(stack)
"""使用 stack = [] 和 stack.append() 是可以达到相同效果的,
因为列表(list)在 Python 中本身就可以充当栈(stack)的数据结构。
实际上,list 本身就是一种动态数组,可以用来实现栈的所有操作,
包括入栈、出栈、查看栈顶元素等。
完全可以使用 stack = [] 来代替 stack = list(),它们的效果是一样的。"""
stack = [] # 创建一个空的栈
for item in s:
if stack and stack[-1] == item:
stack.pop()
print(stack)
else:
stack.append(item)
print(stack)
print("".join(stack))
今日第三题:
150. Evaluate Reverse Polish Notation
概念:后缀表达式
from operator import add,sub,mul
op_map={'+':add,'-':sub,'*':mul,'/':lambda x,y:int(x/y)}
stack = []
for token in tokens:
if token not in{'+','-','*','/'}:
stack.append(int(token))
# if token not in {'+', '-', '*', '/'}::如果当前元素不是运算符,即它是操作数,那么将其转换为整数并压入栈中。
else:
#否则,如果当前元素是运算符,那么从栈中弹出两个操作数(分别是栈顶的两个元素),然后执行与运算符对应的操作函数,将计算结果压入栈中。这里利用了 op_map 字典来查找相应的操作函数,并传递两个操作数给它。
op2 = stack.pop()
op1 = stack.pop()
stack.append(self.op_map[token](op1,op2))
#最终,当遍历完所有元素后,栈中应该只剩下一个元素,即计算结果,使用 stack.pop() 来获取这个结果并返回。
print (stack.pop)
"""
这段代码实现了逆波兰表达式(Reverse Polish Notation,RPN)的求值操作。RPN 是一种将运算符置于操作数之后的数学表达式表示法,计算它的值需要使用栈数据结构来操作。
让我逐行解释这段代码的功能:
from operator import add, sub, mul:这里导入了 operator 模块中的加法、减法和乘法运算符,以便在后面的代码中使用。
op_map 是一个字典,将运算符与相应的操作函数关联起来。例如,'+' 对应于加法函数 add,'-' 对应于减法函数 sub,以此类推。这个字典用于在后面的代码中查找和执行运算符对应的操作函数。
evalRPN(self, tokens: List[str]) -> int 方法用于计算逆波兰表达式的值。它接受一个字符串列表 tokens,其中包含了逆波兰表达式的各个元素(操作数和运算符)。
stack = []:创建一个空栈,用于存储操作数。
for token in tokens::遍历输入的逆波兰表达式中的每个元素。
if token not in {'+', '-', '*', '/'}::如果当前元素不是运算符,即它是操作数,那么将其转换为整数并压入栈中。
否则,如果当前元素是运算符,那么从栈中弹出两个操作数(分别是栈顶的两个元素),然后执行与运算符对应的操作函数,将计算结果压入栈中。这里利用了 op_map 字典来查找相应的操作函数,并传递两个操作数给它。
最终,当遍历完所有元素后,栈中应该只剩下一个元素,即计算结果,使用 stack.pop() 来获取这个结果并返回。
这段代码有效地实现了逆波兰表达式的求值操作,利用栈来处理操作数和运算符,并使用操作函数来执行相应的计算。
"""