预先基础知识:
队列queue是先进先出,栈stack是先进后出
今日第一题:
232. Implement Queue using Stacks
⚠️难点是理解pop
重要的代码:stack_out.append(stack_in.pop())
让out的stack 用逆序装 in的stack
class MyQueue:
def __init__(self):
"""
in主要负责push,out主要负责pop
"""
self.stack_in = []
self.stack_out = []
def push(self, x: int) -> None:
"""
有新元素进来,就往in里面push
"""
self.stack_in.append(x)
def pop(self) -> int:
"""
Removes the element from in front of queue and returns that element.
"""
if self.empty():
return None
if self.stack_out:
return self.stack_out.pop()
"""如果stack_out为空,则表示“传出”队列中没有元素。
在这种情况下,您需要将元素从“传入”队列 ( stack_in) 传输到“传出”队列 ( stack_out),同时保持元素的顺序。"""
else:
for i in range(len(self.stack_in)):
self.stack_out.append(self.stack_in.pop())
return self.stack_out.pop()
"""该代码使用for循环将元素逐个弹出stack_in并将它们推入stack_out。
stack_in该循环以相反的顺序从到传输元素stack_out,从而有效地颠倒了队列中元素的顺序。"""
def peek(self) -> int:
"""
Get the front element.
"""
ans = self.pop()
self.stack_out.append(ans)
return ans
def empty(self) -> bool:
"""
只要in或者out有元素,说明队列不为空
"""
return not (self.stack_in or self.stack_out)
今日第二题:
225. Implement Stack using Queues
思路:把size-1个元素取出来再重复加入,这样就能找到最后一个元素了
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
return self.que[-1]
def empty(self) -> bool:
return not self.que
"""1. `__init__(self)` 方法是类的构造函数,用于初始化栈对象。在这里,它创建了一个空的双端队列(deque),这个队列将用于模拟栈的操作。所以,每个`MyStack`对象都会有一个关联的空队列。
2. `push(self, x: int) -> None` 方法用于将一个整数 `x` 入栈。它简单地将元素 `x` 添加到队列的末尾,因为栈的特性是后进先出(LIFO),所以新元素总是添加到栈顶。
3. `pop(self) -> int` 方法用于出栈操作。它首先检查栈是否为空(通过调用 `empty` 方法),如果为空则返回 `None`。如果栈不为空,它执行一个循环,将队列中除了最后一个元素以外的所有元素逐个取出并重新添加到队列的末尾,从而模拟出栈操作,然后返回被取出的最后一个元素,即栈顶元素。
4. `top(self) -> int` 方法用于获取栈顶元素,但不对栈进行出栈操作。它首先检查栈是否为空,如果为空则返回 `None`。如果栈不为空,它直接返回队列的最后一个元素,即栈顶元素。
5. `empty(self) -> bool` 方法用于判断栈是否为空。它检查队列是否为空,如果队列为空则返回 `True`,否则返回 `False`。"""