可以使用两个队列来实现一个后入先出的栈。以下是 MyStack
类的实现:
from collections import deque
class MyStack:
def __init__(self):
self.queue1 = deque()
self.queue2 = deque()
def push(self, x: int) -> None:
self.queue1.append(x)
def pop(self) -> int:
while len(self.queue1) > 1:
self.queue2.append(self.queue1.popleft())
top_element = self.queue1.popleft()
self.queue1, self.queue2 = self.queue2, self.queue1 # Swap queues
return top_element
def top(self) -> int:
while len(self.queue1) > 1:
self.queue2.append(self.queue1.popleft())
top_element = self.queue1.popleft()
self.queue2.append(top_element) # Put it back
self.queue1, self.queue2 = self.queue2, self.queue1 # Swap queues
return top_element
def empty(self) -> bool:
return not self.queue1
解释:
- push(x): 直接将元素添加到
queue1
中。 - pop(): 将
queue1
的所有元素(除了最后一个)移动到queue2
,然后删除并返回最后一个元素。交换queue1
和queue2
以保证下次操作仍然使用queue1
作为主要存储。 - top(): 过程类似
pop()
,但在取出最后一个元素后,将其放回queue2
以保留。 - empty(): 检查
queue1
是否为空。
这个方法确保了 pop
和 top
操作的正确性,代价是每次 pop
需要 O(n) 的时间复杂度,而 push
仍然是 O(1)。
使用一个队列来实现,python代码如下:
from collections import deque
class MyStack:
def __init__(self):
self.queue = deque()
def push(self, x: int) -> None:
self.queue.append(x)
for _ in range(len(self.queue) - 1):
self.queue.append(self.queue.popleft())
def pop(self) -> int:
return self.queue.popleft()
def top(self) -> int:
return self.queue[0]
def empty(self) -> bool:
return not self.queue
现在的实现使用了一个队列来模拟栈的行为。在 push(x)
操作时,将新元素插入队列后,将前面的元素依次移到队列末尾,以保证 pop()
操作能直接获取栈顶元素。这样可以确保所有操作的正确性,同时 push
仍然是 O(n),pop
和 top
维持 O(1) 时间复杂度。