📅  最后修改于: 2023-12-03 15:40:01.224000             🧑  作者: Mango
有一个栈和两个队列,实现一个数据结构,支持以下操作:
我们可以使用两个队列 q1 和 q2 来模拟栈,分别存储栈中的元素。其中一个队列始终为空,另一个队列用来存储栈中的元素。
push(x): 将元素压入非空队列,使其成为队尾。如果两个队列都为空,则默认将元素压入 q1 中。
pop(): 将非空队列中的前 n-1 个元素依次移动到空队列中,只剩下最后一个元素,即为栈顶元素。弹出该元素并返回。
top(): 将非空队列中的前 n-1 个元素依次移动到空队列中,只剩下最后一个元素,即为栈顶元素。返回该元素。
empty(): 如果 q1 和 q2 都为空,则表示栈为空。否则栈不为空。
具体实现代码如下:
class MyStack:
def __init__(self):
"""
Initialize your data structure here.
"""
self.q1 = []
self.q2 = []
def push(self, x: int) -> None:
"""
Push element x onto stack.
"""
if not self.q2:
self.q1.append(x)
else:
self.q2.append(x)
def pop(self) -> int:
"""
Removes the element on top of the stack and returns that element.
"""
if self.q1:
while len(self.q1) > 1:
self.q2.append(self.q1.pop(0))
return self.q1.pop(0)
else:
while len(self.q2) > 1:
self.q1.append(self.q2.pop(0))
return self.q2.pop(0)
def top(self) -> int:
"""
Get the top element.
"""
if self.q1:
while len(self.q1) > 1:
self.q2.append(self.q1.pop(0))
res = self.q1.pop(0)
self.q2.append(res)
else:
while len(self.q2) > 1:
self.q1.append(self.q2.pop(0))
res = self.q2.pop(0)
self.q1.append(res)
return res
def empty(self) -> bool:
"""
Returns whether the stack is empty.
"""
return not self.q1 and not self.q2
时间复杂度:
空间复杂度:O(n)
由于我们需要两个队列来维护栈,所以空间复杂度为 O(n),其中 n 为栈中元素个数。