20. 有效的括号
题目链接/文章讲解/视频讲解:代码随想录
要考虑好有几种情况不匹配的情况:
1.第一种情况,字符串里左方向的括号多余了 ,所以不匹配。
2.第二种情况,括号没有多余,但是括号的类型没有匹配上
3.第三种情况,字符串里右方向的括号多余了,所以不匹配
第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false
第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false
第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false
class Solution:
def isValid(self, s: str) -> bool:
res = []
for i in range(len(s)):
if s[i] == '(':
res.append(")")
elif s[i] == '[':
res.append(']')
elif s[i] == '{':
res.append('}')
elif not res or s[i] != res[-1]: #这里最开始写的是s[i] != res.pop(),这是不对的,因为这样已经对最后一个元素进行移除了
return False
else:
res.pop()
return False if res else True
1047. 删除字符串中的所有相邻重复项
class Solution:
def removeDuplicates(self, s: str) -> str:
stack = []
for i in range(len(s)):
if not stack or s[i] != stack[-1] :
stack.append(s[i])
else:
stack.pop()
return ''.join(stack)
tips:栈特别擅长于处理相邻字母的某些情况下做一些处理
150. 逆波兰表达式求值
逆波兰表达式相当于是二叉树中的后序遍历(二叉树目前还没学过)
逆波兰表达式主要有以下两个优点:
-
去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
-
适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
stack = []
for i in tokens:
if i not in ["+", "-", "*", "/"]:
stack.append(int(i))
else:
n1=stack.pop()
n2=stack.pop()
if i == '+':
stack.append(n1 + n2)
elif i== '-':
stack.append(n2-n1) # 第一个出来的在运算符后面
elif i == '*':
stack.append(n1*n2)
elif i == '/':
stack.append(int(n2/n1)) #无论浮点数的小数部分值是什么,使用int( )函数转化时,只会保留整数部分,而将小数部分舍去。因此在求浮点数的四舍五入之类的问题时,应该避免直接使用int函数。
return stack.pop()
from operator import add, sub, mul
class Solution:
op_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:
op2 = stack.pop()
op1 = stack.pop()
stack.append(self.op_map[token](op1, op2)) # 第一个出来的在运算符后面
return stack.pop()