栈和队列
队列是先进先出,栈是先进后出。
如图所示:
232. 用栈实现队列
思路
具体参考卡哥写的文章:
使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈一个输入栈,一个输出栈,这里要注意输入栈和输出栈的关系。
下面动画模拟以下队列的执行过程:
执行语句:
queue.push(1);
queue.push(2);
queue.pop(); 注意此时的输出栈的操作
queue.push(3);
queue.push(4);
queue.pop();
queue.pop();注意此时的输出栈的操作
queue.pop();
queue.empty();
push
: 只要数据放进输入栈就好pop
: 输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。empty
: 如果进栈和出栈都为空的话,说明模拟的队列为空了。
代码
class MyQueue:
def __init__(self):
"""
in主要负责push,out主要负责pop
"""
self.stackIn = []
self.stackOut = []
def push(self, x: int) -> None:
"""
有新元素进来,就往in里面push
"""
self.stackIn.append(x)
def pop(self) -> int:
"""
Removes the element from in front of queue and returns that element.
"""
if self.stackOut:
ans = self.stackOut.pop()
else:
while self.stackIn:
self.stackOut.append(self.stackIn.pop())
ans = self.stackOut.pop()
return ans
def peek(self) -> int:
# if self.stackOut:
# ans = self.stackOut.pop()
# self.stackOut.append(ans)
# else:
# while self.stackIn:
# self.stackOut.append(self.stackIn.pop())
# ans = self.stackOut.pop()
# self.stackOut.append(ans)
# 使用刚刚定义的function会更简单
ans = self.pop()
self.stackOut.append(ans)
return ans
def empty(self) -> bool:
"""
只要in或者out有元素,说明队列不为空
"""
return not (self.stackIn or self.stackOut)
复杂度分析
- 时间复杂度:
push
和empty
为O(1)
,pop
和peek
为O(n)
- 空间复杂度:
O(n)
225. 用队列实现栈
使用单项队列
思路
两个队列。一个是主队列,一个是备份队列。
模拟的队列执行语句如下:
queue.push(1);
queue.push(2);
queue.pop(); // 注意弹出的操作
queue.push(3);
queue.push(4);
queue.pop(); // 注意弹出的操作
queue.pop();
queue.pop();
queue.empty();
代码
from collections import deque
class MyStack:
def __init__(self):
self.mainQueue = deque()
self.subQueue = deque()
def push(self, x: int) -> None:
self.mainQueue.append(x)
def pop(self) -> int:
while len(self.mainQueue) > 1:
self.subQueue.append(self.mainQueue.popleft())
ans = self.mainQueue.pop()
while self.subQueue:
self.mainQueue.append(self.subQueue.popleft())
return ans
def top(self) -> int:
"""
1. 首先确认不空
2. 我们仅有in会存放数据,所以返回第一个即可
"""
# ans = self.pop()
# self.push(ans)
# return ans
return self.mainQueue[-1]
def empty(self) -> bool:
"""
因为只有in存了数据,只要判断in是不是有数即可
"""
# return not(self.mainQueue or self.subQueue)
return len(self.mainQueue) == 0
复杂度分析
- 时间复杂度:
pop
和为O(n)
, 其他为O(1)
- 空间复杂度:
O(n)