20.有效的括号
思路:
重在列举出每一种情况:1. 遇到左括号就将右括号进栈;2. 遇到右括号先判断栈是否为空,为空就说明没有对应的左括号,然后判断栈顶元素是否与当前左括号相等,若不等,则说明无法与对应位置的左括号配对;3. 判断玩前两种情况后,剩下的就是合理的右括号,出栈对应元素。
最后还需要判断栈是否为空,必须要为空左右括号的数量才能对应,返回True,否则返回False。
代码:
python
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('}')
elif not stack or stack[-1] != i: # 栈为空或者栈最后的元素与数组不对应
return False
else:
stack.pop()
return True if not stack else False # 还要再判断为空,以免忽略只有左括号的情况
155.最小栈
思路:
用一个辅助的最小栈来记录最小值,注意通用栈入栈、出栈时对最小栈也要进行判断,具体看代码。
代码:
python
class MinStack:
def __init__(self):
self.stack = []
self.min_stack = [] # 辅助栈,用来记录自栈底到栈顶递减的数
def push(self, val: int) -> None:
self.stack.append(val)
if not self.min_stack or val <= self.min_stack[-1]: # 额外用栈记录最小值
self.min_stack.append(val)
def pop(self) -> None:
if self.stack.pop() == self.min_stack[-1]: # 除了通用栈出栈外还要和最小栈比较
self.min_stack.pop()
def top(self) -> int:
return self.stack[-1]
def getMin(self) -> int:
return self.min_stack[-1]