20. 有效的括号
class Solution:
def isValid(self, s: str) -> bool:
stack = []
for i in s:
if i == '(':
stack.append(')')
elif i == '[':
stack.append(']')
elif i == '{':
stack.append('}')
# False的几种情况
# 1)还未匹配完 但栈空了
# 2)栈顶元素和i不相等
elif not stack or stack[-1] != i:
return False
else:
stack.pop ()
# 3)匹配结束了 但栈内还有元素
if not stack:
return True
else:
return False
主要是利用栈判断,遍历s,如果遇到左半边符号,就把相应的右半边符号加入栈中,重点是考虑清楚以下几种情况,是返回F的:
1)还没有遍历完s的全部元素 栈已经空了
2)遍历到的元素和栈顶元素不匹配
3)最后遍历结束后 如果栈内还有元素
1047. 删除字符串中的所有相邻重复项
class Solution:
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)
利用栈的性质解决很方便 要注意 要判断栈不为空 且 i 等于栈顶元素
150. 逆波兰表达式求值
(1)自己AC
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
stack = []
for t in tokens:
if t == "+" or t == "-" or t == "*" or t == "/":
num2 = stack.pop()
num1 = stack.pop()
if t == "+" :
stack.append(int(num1) + int(num2))
if t == "-":
stack.append(int(num1) - int(num2))
if t == "*" :
stack.append(int(num1) * int(num2))
if t == "/":
stack.append(int(num1) / int(num2))
else:
stack.append(t)
return int(stack.pop())
用到栈进行运算,遇到运算符 就把栈顶的两个元素弹出来 进行加减乘除计算后 放入栈中 如果遇到数字 直接放入栈中
(2)用到eval函数
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
stack = []
for t in tokens:
if t not in {"+", "-", "*", "/"}:
stack.append(t)
else:
num1, num2 = stack.pop(), stack.pop()
stack.append(
int(eval(f'{num2}{t}{num1}') )
)
return int(stack.pop())
注:eval() 函数用来执行一个字符串表达式,并返回表达式的值
f ' { } { }' :字符串格式化的一种方式