232. 用栈实现队列
用栈实现队列,需要两个栈。一个负责输入,一个负责输出。由于栈是FILO,所以用栈实现队列时,当实现pop时,需要首先将栈里面全部pop到负责输出的栈中,此时栈顶元素就是作为队列应该输出的值。
class MyQueue:
def __init__(self):
# 栈实现队列需要两个栈
self.stack_in = []
self.stack_out = []
def push(self, x: int) -> None:
self.stack_in.append(x)
def pop(self) -> int:
if self.empty():
return None
if self.stack_out:
return self.stack_out.pop()
else:
for i in range(len(self.stack_in)):
self.stack_out.append(self.stack_in.pop())
return self.stack_out.pop()
def peek(self) -> int:
# 先pop出来获取了值之后再append进去
res = self.pop()
self.stack_out.append(res)
return res
def empty(self) -> bool:
# 如果in和out都有值则队列非空
return not (self.stack_in or self.stack_out)
# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()
# @lc code=end
225. 用队列实现栈
和用栈实现队列类似,队列实现栈也需要两个队列,一个负责输入,一个负责输出。队列是FIFO,因此在实现栈的输出时,需要获取队尾的数据,并将这个数据pop,因此需要将队列中除了最后一个元素之外,剩下的所有元素都pop到另一个栈中。
重难点(和用栈实现队列不同):
1. 输出时,队列需要留最后一个元素作为栈顶元素输出;
2. 为了便于判断是否非空,需要将queue_in作为有值的那个队列,因为pop时,剩栈顶值的那个queue会被清空,为了便于判断,在1的步骤之后需要执行in和out的queue相互交换的操作;
3. top中pop之后那个值应该放在in的queue中(因为设定queue_in中有值)。
from collections import deque
# @lc code=start
class MyStack:
def __init__(self):
self.queue_in = deque()
self.queue_out = deque()
def push(self, x: int) -> None:
self.queue_in.append(x)
def pop(self) -> int:
if self.empty():
return None
for i in range(len(self.queue_in) - 1):
self.queue_out.append(self.queue_in.popleft())
self.queue_in, self.queue_out = self.queue_out, self.queue_in # 交换in和out,这也是为啥in只用来存
return self.queue_out.popleft()
def top(self) -> int:
if self.empty():
return None
for i in range(len(self.queue_in) - 1):
self.queue_out.append(self.queue_in.popleft())
self.queue_in, self.queue_out = self.queue_out, self.queue_in
res = self.queue_out.popleft()
self.queue_in.append(res)
return res
def empty(self) -> bool:
# 当队列中有一个非空时 则非空
return not (self.queue_in)
# 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()
# @lc code=end