用两个队列实现一个栈。
LeetCode
思路分析
通过一系列的栈的压入弹出操作来分析。
首先往栈内压入一个元素,由于两个队列都是空的。不妨把数据插入queue1。接下来继续压入b,c。这时queue1包含{a,b,c}。其中a位于队列头部。
现在考虑从栈中弹出一个元素,根据栈的后入先出元素,应该弹出c。不过c位于queue1尾部。可以先从queue1中依次删除元素a,b并插入到queue2中。再从queue1中弹出最后一个元素c,就实现了从栈中弹出元素的效果。
考虑压入一个元素d。此时queue1中已经有一个元素,把d插入到queue1尾部,此时进行pop操作,弹出的应该是d,符合要求
Code
思路:类似两个栈实现队列。queue1用来存放数据,每次入栈就插入queue1索引值为0的地方。queue2为出栈时的辅助队列,将queue1[1:-1]的元素出队然后入队queue2(也就是queue1逆序压入queue2),然后queue1仅剩队首元素,这个时候出队即出栈。
列表中的insert(0)和pop()可以模拟队列
class MyStack:
def __init__(self):
"""
Initialize your data structure here.
"""
self.queue1 = []
self.queue2 = []
def push(self, x: int) -> None:
"""
Push element x onto stack.
"""
self.queue1.insert(0, x)
def pop(self) -> int:
"""
Removes the element on top of the stack and returns that element.
"""
for _ in range(len(self.queue1)-1):
self.queue2.insert(0, self.queue1.pop())
res = self.queue1.pop()
self.queue1 = self.queue2
self.queue2 = []
return res
def top(self) -> int:
"""
Get the top element.
"""
self.queue2 = self.queue1[:]
for _ in range(len(self.queue1)-1):
self.queue1.pop()
res = self.queue1[-1]
self.queue1 = self.queue2
self.queue2 = []
return res
def empty(self) -> bool:
"""
Returns whether the stack is empty.
"""
if len(self.queue1):
return False
return True