力扣232. 用栈实现队列
模拟的过程有点点难以理解。 通过构建两个栈in和put,模拟队列的进和出。
class MyQueue:
# 队列: 先进先出
def __init__(self):
self.stuck_in = []
self.stuck_out = [] # 初始化创建两个矩阵
def push(self, x: int) -> None:
# 压入队尾
self.stuck_in.append(x)
def pop(self) -> int:
# 删除队首
if self.empty(): # 判断数据是否为空
return None
if self.stuck_out: #判断出栈队列是否为空
return self.stuck_out.pop()
else:
for _ in range(len(self.stuck_in)):
self.stuck_out.append(self.stuck_in.pop()) # 倒过来模拟出队操作
return self.stuck_out.pop()
def peek(self) -> int:
if self.empty():
return None
if self.stuck_out: # 判断出栈队列是否为空
p = self.stuck_out.pop()
self.stuck_out.append(p)
return p # 不为空可直接pop
else:
for _ in range(len(self.stuck_in)): # 为空则需将入栈队列复制到出栈队列
self.stuck_out.append(self.stuck_in.pop())
p = self.stuck_out.pop()
self.stuck_out.append(p)
return p
def empty(self) -> bool:
return not (self.stuck_in or self.stuck_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()
力扣225. 用队列实现栈
一样的思路,注意建立的list只能后面进前面出,所以使用popleft或pop(0)
class MyStack:
def __init__(self):
self.que = []
def push(self, x: int) -> None:
self.que.append(x)
def pop(self) -> int:
# 栈顶: 队列的进口,que最前面的
if self.empty():
return None
for _ in range(len(self.que)-1):
self.que.append(self.que.pop(0))
return self.que.pop(0)
def top(self) -> int:
if self.empty():
return None
for _ in range(len(self.que)-1):
self.que.append(self.que.pop(0))
t = self.que.pop(0)
self.que.append(t)
return t # 直接return self.que[0]
def empty(self) -> bool:
return self.que == []
# 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()