文档讲解:代码随想录
视频讲解:代码随想录B站账号
状态:看了视频题解和文章解析后做出来了
232.用栈实现队列
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:
for i in range(len(self.stack_in)):
self.stack_out.append(self.stack_in.pop())
return self.stack_out.pop()
def peek(self) -> int:
ans = self.pop()
self.stack_out.append(ans)
return ans
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()
思路:此题是使用栈来模拟队列的行为,分别有四个行为需要模拟:1. push入队列 2. pop即出队列 3. peek查看队列下一个要出的元素 4. 查看队列是否为空
使用两个栈来模拟队列的行为,stack_in用来存储进来的元素,一旦执行了pop或peek操作那么stack_out就要接收来自stack_in里存储的值。
这里peek复用了pop的逻辑,避免重复判断逻辑。被peek的值被加入了stack_out栈中,因为如果加入到stack_in中,如果stack_out中此时还有其他值,那么pop就会输出多出的那个值,但实际上应该输出peek的那个值。
只有当两个栈都为空时,此时队列才为空。这里有两种情况:1. 还没开始入元素 2. push和pop被调用了同样的次数。
25. 用队列实现栈
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 i 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()
思路:使用队列来模拟栈。如果使用上道题的两个队列的方式,会发现其实并没有实现栈的先进后出功能,因为使用队列的方式复制的话顺序其实是一样的,队列也并没有pop的函数所以不可行。
其实还是可以用两个队列来实现这道题,但第二个队列的作用并不是输出,而是将第一个队列里元素进行复制,除了最后一个元素,即我们需要输出pop的元素。
当然也可以像代码中使用一个队列来实现,我们采用原地popleft和append的方式,将队列最后的一个元素移动到队列的第一位,然后popleft输出这个值即可。