


可以使用两个队列来实现一个后入先出的栈。以下是 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) 时间复杂度。
717

被折叠的 条评论
为什么被折叠?



