wuyijia

导航

栈基础题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

 

单调栈 

739. 每日温度

 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

 496. 下一个更大元素 I

 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

232. 用栈实现队列

 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()

 

 
 
 
 

posted on 2023-08-26 20:03  小吴要努力  阅读(9)  评论(0编辑  收藏  举报