leetcode 225【队列实现栈】
使用队列实现栈的下列操作:
push(x) – 元素 x 入栈
pop() – 移除栈顶元素
top() – 获取栈顶元素
empty() – 返回栈是否为空
题目链接
https://leetcode-cn.com/problems/implement-stack-using-queues/
解题思路与代码思路:
双队列法
利用辅助队列的方式,queue1用于存储栈内的元素,queue2作为入栈操作的辅助队列。 有元素入栈,就把队列一的元素存入队列二,新元素进入队列一,再把队列二的元素出队再入队队列一。可以把列表改成collections的deque,把pop方法改成popleft(),效率更高
单队列法
主要区别就是在入栈push操作那里。做法是记录队列本来的元素个数,然后先插入新元素,然后把n个旧元素出队并重新入队。其他操作依旧。
代码:
双队列法
class MyStack:
def __init__(self):
self.queue1 = []
self.queue2 = []
def push(self,x):
self.queue2.append(x)
while self.queue1:
self.queue2.append(self.queue1.pop(0))
self.queue1,self.queue2 = self.queue2,self.queue1
def pop(self):
return self.queue1.pop(0)
def top(self):
return self.queue1[0]
def empty(self):
return not self.queue1
单队列法
def __init__(self):
self.queue = collections.deque()
def push(self,x):
n = len(self.queue)
self.queue.append(x)
for _ in range(n):
self.queue.append(self.queue.popleft())
def pop(self):
return self.queue.popleft()
def top(self):
return self.queue[0]
def empty(self):
return not self.queue
复 杂 度 分 析 : \color{red}{复杂度分析:} 复杂度分析:
- 双队列法
- 时间复杂度:入栈操作 O(n),其余操作都是 O(1)
入栈需要将queue1中的n个元素出队并入队到queue2,共2n+1操作,出队入队操作的时间复杂度为O(1),所以入栈操作的复杂度是O(n);
出栈是将queue1的前端元素出队,为O(1)
返回栈顶元素也是O(1)
判断是否为空只需要判断queue1是否为空,也是O(1) - 空间复杂度:O(N),n为栈内元素,用两个队列存栈内元素
- 单队列法
- 时间复杂度:入栈操作 O(n),其余操作都是 O(1)
- 空间复杂度:O(N)