用队列实现栈-力扣
思路
- 用单队列list实现
使用list,添加元素后,反转进队列的前n-1个元素,最后一个进入的元素由在队尾变在队首。
class MyStack:
def __init__(self):
self.q=list()
def push(self, x: int) -> None:
self.q.append(x)
n=len(self.q)
while n > 1:
#反转前n-1个元素,栈顶元素在队首
#1234,反转前n-1后,是4123
self.q.append(self.q.pop(0))
n=n-1
def pop(self) -> int:
return self.q.pop(0)
def top(self) -> int:
return self.q[0]
def empty(self) -> bool:
return not self.q
# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()
- 双队列(deque)实现
一个队列为主,另一个队列辅助
pop(): 先把主队列中0:n-1的元素加入辅助队列,用popleft();再把主队列和辅助队列交换,此时辅助队列中是最后一个入队元素,依据栈的后进先出规则,弹出辅助队列popleft().
from collections import deque
class MyStack:
def __init__(self):
# data只放数据,help辅助,仅在pop时用到
self.queue_data=deque()
self.queue_help=deque()
def push(self, x: int) -> None:
self.queue_data.append(x)
def pop(self) -> int:
#为空处理
if self.empty():
return None
#把队列0:n-1的元素放入help中,data中只留最后进入的元素
while len(self.queue_data) > 1:
self.queue_help.append(self.queue_data.popleft())
#交换
self.queue_help,self.queue_data=self.queue_data,self.queue_help
return self.queue_help.popleft()
def top(self) -> int:
#为空处理
if self.empty():
return None
return self.queue_data[-1]
def empty(self) -> bool:
return len(self.queue_data)==0
# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()