第五章 栈与队列part01
理论基础
了解一下 栈与队列的内部实现机制,文中是以C++为例讲解的。
文章讲解:代码随想录
232.用栈实现队列 ✅
大家可以先看视频,了解一下模拟的过程,然后写代码会轻松很多。
题目链接/文章讲解/视频讲解:代码随想录
# 232
class MyQueue(object):
def __init__(self):
self.stackIn = []
self.stackOut = []
def push(self, x):
"""
:type x: int
:rtype: None
"""
self.stackIn.append(x)
def pop(self):
"""
:rtype: int
"""
if not self.stackOut: #如果Out是空的
while self.stackIn:
self.stackOut.append(self.stackIn.pop())
return self.stackOut.pop() if self.stackOut else None
def peek(self):
"""
:rtype: int
"""
ans = self.pop() # 复用代码!!直接调用!
self.stackOut.append(ans)
return ans
def empty(self):
"""
:rtype: bool
"""
return not self.stackIn and not self.stackOut
# 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. 用队列实现栈 ✅
可能大家惯性思维,以为还要两个队列来模拟栈,其实只用一个队列就可以模拟栈了。
建议大家掌握一个队列的方法,更简单一些,可以先看视频讲解
题目链接/文章讲解/视频讲解:代码随想录
# 225
class MyStack(object):
def __init__(self):
self.que = deque()
def push(self, x):
self.que.append(x)
def pop(self):
if self.empty():
return None
for i in range(len(self.que)-1):
self.que.append(self.que.popleft())
return self.que.popleft()
def top(self):
temp = self.pop()
self.que.append(temp)
return temp
def empty(self):
return not self.que
# 225
# 这题不能用双端队列的!对列定义就是一端进一端出 这里就是熟悉一下别的用法
class MyStack(object):
def __init__(self):
self.que = deque()
def push(self, x):
self.que.append(x)
def pop(self):
if self.empty():
return None
return self.que.pop()
def top(self):
return self.que[-1]
def empty(self):
return not self.que
20. 有效的括号 ✅
讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。
大家先自己思考一下 有哪些不匹配的场景,在看视频 我讲的都有哪些场景,落实到代码其实就容易很多了。
题目链接/文章讲解/视频讲解:代码随想录
# 20
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
stack = []
if len(s) % 2 == 1:
return False
else:
for _ in s:
if _ == '[': stack.append(']')
elif _ == '(': stack.append(')')
elif _ == '{': stack.append('}')
elif not stack or _ != stack[-1]:
return False
else: stack.pop()
return True if not stack else False
1047. 删除字符串中的所有相邻重复项 ✅
栈的经典应用。
要知道栈为什么适合做这种类似于爱消除的操作,因为栈帮助我们记录了 遍历数组当前元素时候,前一个元素是什么。
题目链接/文章讲解/视频讲解:代码随想录
# 1047
class Solution(object):
def removeDuplicates(self, s):
"""
:type s: str
:rtype: str
"""
stack = []
for _ in s:
if not stack or stack[-1] != _:
stack.append(_)
else:
stack.pop()
return ''.join(stack)