leetcode 232.用栈实现队列
题目
232.用栈实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
解题思路
1、定义两个列表,列表1用于入栈,列表2用于出栈
2、push元素:直接使用list.append(s)向入栈列表中添加元素
3、empty:判断队列是否为空,如果入栈和出栈两个列表均为空,说明队列为空,返回True
4、pop元素:队列是先进先出
(1)如果队列为空,则pop弹出元素返回None
(2)如果队列不为空,判断出栈的列表是否为空
出栈列表不为空,直接使用pop函数从栈顶弹出元素
出栈列表为空,把入栈列表中的元素弹出到出栈列表中,再从出栈列表栈顶弹出元素
5、peek元素:
执行队列的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(): # 如果队列为空,pop操作没有元素可以弹出,返回None
return None
if self.stack_out: # 如果出栈中有元素,直接从栈的末尾弹出元素
return self.stack_out.pop() # list.pop(index = -1) 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:
res = self.pop() # 从队列的开头移除并返回元素:入栈的元素全部弹出,插入到出栈中,再从出栈末尾依次弹出元素
self.stack_out.append(res) # 把从出栈栈顶弹出的元素再添加到出栈中
return res # 返回队列开头的元素
def empty(self, x: int) -> bool:
# 如果出栈和入栈都没有元素,则队列为空
return not (self.stack_out or self.stack_in)
leetcode 225.用队列实现栈
题目
225.用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
解题思路
1、使用双向队列deque
2、在双向队列的右边添加元素,模拟将元素压入栈顶
3、移除并返回栈顶元素:
假设入栈的元素是1,2,3 则移除并返回的栈顶元素是3
如果是队列的话,进队列顺序1,2,3 出队列顺序也是1,2,3,现在用队列模拟栈移除并返回栈顶元素,则需要移除返回队列的最后一个元素3
队列模拟栈的pop方式:
1)依次从队列的左边弹出len(deque)-1个元素,剩余最后一个进队列的元素(即栈要移除并返回的栈顶元素)
2)把从队列左边弹出的元素依次添加到队列的右边
3)从队列的左边弹出并返回进队列的最后一个元素
实现代码
from collections import deque
class MyStack:
def __init__(self):
self.deq = deque() # 初始化一个双向队列
def push(self, x: int) -> None:
self.deq.append(x) # 在队列的右边添加一个元素,模拟在栈顶添加一个元素
def pop(self) -> int:
# 如果队列为空
if self.empty():
return None
else: # 队列不为空时,遍历队列左边的n-1个元素
for i in range(len(self.deq)-1):
self.deq.append(self.deq.popleft()) # 把左边的n-1个元素弹出后添加到队列的右边
return self.deq.popleft() # 返回队列中剩余的最后一个元素(队列最右边一个元素),模拟弹出栈顶元素并返回
def top(self) -> int:
if self.empty():
return None
res = self.pop() # 弹出斌返回栈顶元素
self.deq.append(res) # 把弹出的栈顶元素添加到队列右边
return res
def empty(self) -> bool:
return not self.deq