代码随想录算法训练营|Day 10
Day 10
理论基础
了解一下 栈与队列的内部实现机制,文中是以C++为例讲解的
文章讲解:https://programmercarl.com/栈与队列理论基础.html
232.用栈实现队列
题目链接/文章讲解/视频讲解:https://programmercarl.com/0232.用栈实现队列.html
两个栈(n.):入栈 出栈
弹出时: 出栈为空,将入栈所有元素弹到出栈;否则,弹出出栈中元素
peek:查询最顶上数值 代码复用,先pop再push
class MyQueue:
def __init__(self):
self.stack_in = []
self.stack_out = []
def push(self, x: int) -> None:
self.stack_in.append(x)
def pop(self) -> int:
if self.empty():
return None
if self.stack_out:
return self.stack_out.pop()
else:
while self.stack_in:
self.stack_out.append(self.stack_in.pop())
return self.stack_out.pop()
def peek(self) -> int:
res = self.pop()
self.stack_out.append(res)
return res
def empty(self) -> bool:
return not (self.stack_in or self.stack_out)
# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()
225. 用队列实现栈
题目链接/文章讲解/视频讲解:https://programmercarl.com/0225.用队列实现栈.html
队列里有size个元素,出(size-1)个元素再把它们都入进队列,再出来的那个元素就ok
class MyStack:
def __init__(self):
self.que = deque()
def push(self, x: int) -> None:
self.que.append(x)
def pop(self) -> int:
if self.empty():
return None
for _ in range(len(self.que)-1):
self.que.append(self.que.popleft())
return self.que.popleft()
def top(self) -> int:
ans = self.pop()
self.que.append(ans)
return ans
def empty(self) -> bool:
return not self.que
# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()

20. 有效的括号
题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.有效的括号.html
遇到左括号,把右括号push入栈。
遇到右括号,开始pop出栈看是否相等
情况1: 发现了不匹配的,return false
情况2: 字符串遍历完,栈不为空,说明左括号多了,return false
情况3: 字符串没遍历完,栈就为空了,说明右括号多了,return false
为什么%2无法把左括号多了or右括号多了的情况排除:
如果多的数字是偶数个,那么就无法排除
class Solution:
def isValid(self, s: str) -> bool:
stack = []
if len(s) % 2 != 0:
return False
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.pop() != s[i]:
return False
if stack:
return False
return True
1047. 删除字符串中的所有相邻重复项
栈的经典应用。
要知道栈为什么适合做这种类似于爱消除的操作,因为栈帮助我们记录了 遍历数组当前元素时候,前一个元素是什么
使用栈的原因:
需要数据结构帮我们记住遍历过的元素
class Solution:
def removeDuplicates(self, s: str) -> str:
stack = []
for i in range(len(s)):
if not stack:
stack.append(s[i])
else:
if stack[-1] == s[i]:
stack.pop()
else:
stack.append(s[i])
return ''.join(stack)
# 方法一,使用栈
class Solution:
def removeDuplicates(self, s: str) -> str:
res = list()
for item in s:
if res and res[-1] == item:
res.pop()
else:
res.append(item)
return "".join(res) # 字符串拼接


浙公网安备 33010602011771号