栈基础题20、496、232
20. 有效的括号
1 class Solution: 2 #遍历完字符串后,栈是空的,说明全部匹配了 3 def isValid(self, s: str) -> bool: 4 stack = [] 5 #剪枝 6 if len(s) % 2 != 0: 7 return False 8 9 for item in s: 10 if item == '(': 11 stack.append(')') 12 elif item == '[': 13 stack.append(']') 14 elif item == '{': 15 stack.append('}') 16 #第三种情况栈已经为空了,右边括号多了 17 #第二种情况是括号不匹配 18 elif not stack or stack[-1] != item: 19 return False 20 else: 21 stack.pop() 22 #第一种情况,遍历完字符串后,栈不为空,还有右括号在栈里,说明原字符串中左括号多余 23 return True if not stack else False 24
#第二种:字典快一点 stack = [] mapping = { '(': ')', '[': ']', '{': '}' } for item in s: if item in mapping.keys(): stack.append(mapping[item]) elif not stack or stack[-1] != item: return False else: stack.pop() return True if not stack else False
单调栈
1 class Solution: 2 def dailyTemperatures(self, temperatures: List[int]) -> List[int]: 3 answer = [0]*len(temperatures) 4 stack = [0] #将数组中的第一个元素的下标存放在栈里 5 for i in range(1,len(temperatures)): #遍历的时候直接从i=1开始 6 # 情况一和情况二 当前元素比栈里元素小于等于时加入栈中 7 if temperatures[i]<=temperatures[stack[-1]]: 8 stack.append(i) 9 # 情况三 是一个持续过程,当前元素比栈顶元素大的时候,弹出栈顶元素,计算结果,并将当前元素加入栈里 10 else: 11 while len(stack) != 0 and temperatures[i]>temperatures[stack[-1]]: 12 answer[stack[-1]]=i-stack[-1] 13 stack.pop() 14 stack.append(i) 15 16 return answer 17 18 #精简版 19 # answer = [0]*len(temperatures) 20 # stack = [] 21 # for i in range(len(temperatures)): 22 # while len(stack)>0 and temperatures[i] > temperatures[stack[-1]]: 23 # answer[stack[-1]] = i - stack[-1] 24 # stack.pop() 25 # stack.append(i) 26 # return answer
1 class Solution: 2 def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]: 3 #单调栈+(哈希映射) 4 result = [-1] * len(nums1) 5 stack = [0] #存放数组2的0号下标 6 for i in range(1,len(nums2)): 7 if nums2[i] <= nums2[stack[-1]]: 8 stack.append(i) 9 else: 10 #栈不为空再弹出元素 #s是一个持续的过程 11 while len(stack) != 0 and nums2[i] > nums2[stack[-1]]: 12 if nums2[stack[-1]] in nums1: 13 #找出对应值在数组1中的下标 14 index = nums1.index(nums2[stack[-1]]) 15 result[index] = nums2[i] 16 stack.pop() 17 stack.append(i) #找到符合条件的值之后,再将当前元素加入栈中 18 19 return result
1 class MyQueue: #用两个栈实现一个队列的先进先出 2 3 def __init__(self): 4 self.stack_in = [] #负责加元素push,压栈 ---append 5 self.stack_out = [] #负责出元素pop,出栈 6 7 8 def push(self, x: int) -> None: #将元素 x 推到队列的末尾 9 self.stack_in.append(x) 10 11 12 def pop(self) -> int: #从队列的开头移除并返回元素 13 #出栈,先判断栈不为空 14 if self.empty(): 15 return None 16 17 if self.stack_out: 18 return self.stack_out.pop() 19 else: 20 for i in range(len(self.stack_in)): 21 self.stack_out.append(self.stack_in.pop()) 22 23 return self.stack_out.pop() 24 25 26 def peek(self) -> int: #返回队列开头的元素 27 ans = self.pop() #直接利用已经定义好的pop()函数 28 self.stack_out.append(ans) #再将弹出去的元素加回出栈里 29 return ans 30 31 32 33 def empty(self) -> bool: 34 #只要in或者out有元素,说明队列不为空 35 return not (self.stack_in or self.stack_out) 36 37 38 39 # Your MyQueue object will be instantiated and called as such: 40 # obj = MyQueue() 41 # obj.push(x) 42 # param_2 = obj.pop() 43 # param_3 = obj.peek() 44 # param_4 = obj.empty()