1、有效的括号
解题关键:三种无效的情况:
第一:循环过程中:栈为空
第二:循环过程中:不匹配(要先判断是否为空)
第三:循环结束后栈不为空
def isValid(self, s: str) -> bool:
if len(s)%2 != 0:
return False
stack = []
for i in s:
if i == "(":
stack.append(")")
elif i == "{":
stack.append("}")
elif i == "[":
stack.append("]")
else:
if len(stack)==0:
return False
st = stack.pop()
if i != st:
return False
if len(stack) != 0 :
return False
else:
return True
2、
解题关键:使用栈解决:栈不为空则比较pop的值是否等于当前值,否则压栈
def removeDuplicates(self, s: str) -> str:
stack = []
for i in s:
if stack and i == stack[-1]:
stack.pop()
else:
stack.append(i)
return "".join(stack)
注意,stack是列表,返回时写法"".join(stack)
3
注意:第一个弹出的值时第二个值。所以除法的时候应该注意顺序
def evalRPN(self, tokens: List[str]) -> int:
stack = []
for i in tokens:
if i == "+" or i == "-" or i == "*" or i == "/":
x = int(stack.pop())
y = int(stack.pop())
if i == "+":
stack.append(x+y)
elif i =="-":
stack.append(x-y)
elif i =="*":
stack.append(x*y)
elif i =="/":
stack.append(y/x)
else :
stack.append(int(i))
return stack.pop()
简便写法:
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()