232.用栈实现队列
题目链接:
题目描述:
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push
、pop
、peek
、empty
):
实现 MyQueue
类:
void push(int x)
将元素 x 推到队列的末尾int pop()
从队列的开头移除并返回元素int peek()
返回队列开头的元素boolean empty()
如果队列为空,返回true
;否则,返回false
解题思路:
使用两个栈操作元素即可,stack_in和stack_out
1,push操作存放在stack_in中。
2,pop操作,从 'stack_out' 弹出元素 ,如果 'stack_out' 为空,先从 'stack_in' 转移元素 #,然后再弹出队头元素
3,top操作,和pop一样,所以直接调用pop,之后再将弹出的元素加入stack_in中即可
4,empty操作,只要in或者out有元素,说明队列不为空
代码:
class MyQueue:
def __init__(self):
# 初始化两个栈,用于队列的实现
self.stack_in = [] # 用于入队(push)操作的栈
self.stack_out = [] # 用于出队(pop)和查看队头(peek)操作的栈
def push(self, x: int) -> None:
# 入队操作,将元素压入 'stack_in'
self.stack_in.append(x)
def pop(self) -> int:
# 出队操作,从 'stack_out' 弹出元素
# 如果 'stack_out' 为空,先从 'stack_in' 转移元素
# 然后再弹出队头元素
if self.empty(): # 检查队列是否为空
return None
if self.stack_out: # 如果 'stack_out' 不为空,直接从中弹出元素
return self.stack_out.pop()
else:
# 从 'stack_in' 转移元素到 'stack_out'
while self.stack_in:
self.stack_out.append(self.stack_in.pop())
# 从 'stack_out' 弹出队头元素
return self.stack_out.pop()
def peek(self) -> int:
# 查看队头元素但不移除它
# 如果 'stack_out' 为空,先从 'stack_in' 转移元素
# 然后再查看队头元素
if self.empty(): # 检查队列是否为空
return None
# 从 'stack_out' 弹出队头元素并存储
ans = self.pop()
# 将存储的队头元素重新放回 'stack_out'
self.stack_out.append(ans)
return ans
def empty(self) -> bool:
# 检查 'stack_in' 和 'stack_out' 是否都为空
return not (self.stack_in or self.stack_out)
# 通过以下方式实例化 MyQueue 对象并调用相应方法:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()
225. 用队列实现栈
题目链接:
题目描述:
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
实现 MyStack
类:
void push(int x)
将元素 x 压入栈顶。int pop()
移除并返回栈顶元素。int top()
返回栈顶元素。boolean empty()
如果栈是空的,返回true
;否则,返回false
。
解题思路:
使用一个队列即可,将这个队列弹出的元素再添加回队列即可完成模拟栈的操作。
代码:
class MyStack:
def __init__(self):
# 使用双端队列作为栈的底层数据结构
self.que = deque()
def push(self, x: int) -> None:
# 入栈操作,将元素追加到队尾
self.que.append(x)
def pop(self) -> int:
# 出栈操作,移除栈顶元素并返回
if self.empty():
return None
# 将队列中除了最后一个元素外的所有元素出队并再次入队
for i in range(len(self.que) - 1):
self.que.append(self.que.popleft())
# 返回出队的最后一个元素,即为栈顶元素
return self.que.popleft()
def top(self) -> int:
# 查看栈顶元素但不移除
if self.empty():
return None
# 将队列中除了最后一个元素外的所有元素出队并再次入队
for i in range(len(self.que) - 1):
self.que.append(self.que.popleft())
# 临时存储出队的最后一个元素
temp = self.que.popleft()
# 将临时存储的元素再次入队
self.que.append(temp)
# 返回栈顶元素
return temp
def empty(self) -> bool:
# 检查栈是否为空
return not self.que
# 通过以下方式实例化 MyStack 对象并调用相应方法:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()