这三题都用到了栈的先进后出的原理,知道原理就可以做了
20. 有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
class Solution:
def isValid(self, s: str) -> bool:
matchup=[]
i=''
for i in s:
if i=='(':
matchup.append(')')
elif i=='[':
matchup.append(']')
elif i=='{':
matchup.append('}')
elif not matchup or matchup[-1]!=i: #没有配对的 或者 多余的
return False
else:
matchup.pop()
if matchup: #少的
return False
else:
return True
1047. 删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S
,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
class Solution:
def removeDuplicates(self, s: str) -> str:
matchup=[]
for item in s:
if matchup:
if matchup[-1]==item:
matchup.pop()
else:
matchup.append(item)
else:
matchup.append(item)
return ''.join(matchup)
150. 逆波兰表达式求值
给你一个字符串数组 tokens
,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
- 有效的算符为
'+'
、'-'
、'*'
和'/'
。 - 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
- 两个整数之间的除法总是 向零截断 。
- 表达式中不含除零运算。
- 输入是一个根据逆波兰表示法表示的算术表达式。
- 答案及所有中间计算结果可以用 32 位 整数表示。
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
saveup=[]
i=0
while i<len(tokens):
item=tokens[i]
if item.isdigit() or item[1:].isdigit():
saveup.append(int(item))
else:
middle=[]
b=saveup.pop()
a=saveup.pop()
if item=="+":
saveup.append(a+b)
elif item=="-":
saveup.append(a-b)
elif item=="*":
saveup.append(a*b)
else:
saveup.append(int(a / b))
i+=1
return saveup[0]