20. 有效的括号
题目链接/文章讲解/视频讲解:代码随想录
无效的括号有三种情况:
1.多左括号,但是无相应的右括号与之匹配
2.顺序不匹配
3.多右括号,无相应的左括号与之匹配
新建一个栈用来存储当前括号的对应括号(此栈仅保存右括号),在push的过程中,若遇到相同的右括号,则将当前右括号弹出
栈的情况:
1.原字符串已经遍历完毕,但是栈不为空;
2.遍历过程中,元素不同(此时栈不为空);
3.原字符串未遍历完,栈已经为空。
class Solution:
def isValid(self, s: str) -> bool:
#用list来模拟栈
stack = []
for i in range(len(s)):
if s[i] == '(':
stack.append(')')
elif s[i] == '[':
stack.append(']')
elif s[i] == '{':
stack.append('}')
elif not stack or stack[-1] != s[i]:
return False
else:
stack.pop() #移除最后一个元素
return True if not stack else False
1047. 删除字符串中的所有相邻重复项
题目链接/文章讲解/视频讲解:代码随想录
方法:使用栈模拟,遇到相同的元素,即将元素弹出
class Solution:
def removeDuplicates(self, s: str) -> str:
stack = []
for item in s:
if stack and stack[-1] == item:
stack.pop()
else:
stack.append(item)
return ''.join(stack)
150. 逆波兰表达式求值
题目链接/文章讲解/视频讲解:代码随想录
关键:要将弹出的两个元素进行运算后push到栈内,再进行后续运算
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
signal = ['+','-','*','/']
stack = []
for i in range(len(tokens)):
if tokens[i] not in signal:
stack.append(int(tokens[i]))
else:
nums1 = stack.pop()
nums2 = stack.pop()
if tokens[i] == '+':
stack.append( nums2 + nums1)
elif tokens[i] == '-':
stack.append(nums2 - nums1)
elif tokens[i] == '*':
stack.append(nums2 * nums1)
elif tokens[i] == '/':
stack.append(int(nums2 / nums1))
return stack[-1]