栈与队列part01(24.01.05)
安排:先独立做题,然后看视频讲解,然后看文章讲解,然后再重新做一遍题,把题目AC,最后整理成今日当天的博客。
- 学习时长:2h
- 学习内容:自己尝试+pdf说明+视频+力扣题解+自己默写
- 学习感悟:早点开始 别拖延!
栈与队列理论基础
文章链接:代码随想录 (programmercarl.com)
队列是先进先出,栈是先进后出。(感觉队列的进出方向好像应该是从右到左的,即左边是队头右边是队尾)
232.用栈实现队列
题目链接:力扣题目链接
笔记:
1.思路是:「输入栈」会把输入顺序颠倒;如果把「输入栈」的元素逐个弹出放到「输出栈」,再从「输出栈」弹出元素的时候,则可以负负得正,实现了先进先出。
具体做法:
可以把一个栈当做「输入栈」,把另一个栈当做「输出栈」。
当 push() 新元素的时候,放到「输入栈」的栈顶,记此顺序为「输入序」。
当 pop() 元素的时候,是从「输出栈」弹出元素。如果「输出栈」为空,则把「输入栈」的元素逐个 pop() 并且 push() 到「输出栈」中,这一步会把「输入栈」的栈底元素放到了「输出栈」的栈顶。此时负负得正,从「输出栈」的 pop() 元素的顺序与「输入序」相同。
2.not self.stack1
:这部分检查 self.stack1
是否为空。如果 self.stack1
为空,not self.stack1
就为 True
;否则,为 False
。not self.stack2
:这部分检查 self.stack2
是否为空。如果 self.stack2
为空,not self.stack2
就为 True
;否则,为 False
。
整个表达式使用 and
运算符连接两个条件,表示只有当两个条件都为 True
时,整个表达式才为 True
。因此,如果 self.stack1
和 self.stack2
都为空,整个表达式的结果就是 True
,否则为 False
。
这样的表达式通常用于判断两个数据结构是否同时为空。
提交代码:
class MyQueue:
def __init__(self):
self.stack1 = []
self.stack2 = []
def push(self, x: int) -> None:
self.stack1.append(x)
def pop(self) -> int:
if not self.stack2:
while self.stack1:
self.stack2.append(self.stack1.pop())
return self.stack2.pop()
def peek(self) -> int:
if not self.stack2:
while self.stack1:
self.stack2.append(self.stack1.pop())
return self.stack2[-1]
def empty(self) -> bool:
return not self.stack1 and not self.stack2
225. 用队列实现栈
题目链接:力扣题目链接
总体思路:
笔记:
1.collections.deque
(双端队列)是 Python 标准库中 collections
模块提供的一种数据结构。Deque 是一个双向队列,支持在两端进行高效的 O(1) 时间复杂度的操作,包括元素的添加、删除和查看。这与列表(List)相比,deque 在队头和队尾执行的操作更为高效。
2.这行代码的作用是将self.popQueue
队列的左端(队头)元素取出,并追加到self.pushQueue
队列的右端(队尾)。
self.pushQueue.append(self.popQueue.popleft())
3.self.popQueue.popleft()
:这是collections.deque
提供的方法,用于从队列的左端弹出一个元素。
提交代码:
class MyStack:
def __init__(self):
self.pushQueue = collections.deque()
self.popQueue = collections.deque()
def push(self, x: int) -> None:
self.pushQueue.append(x)
while self.popQueue:
self.pushQueue.append(self.popQueue.popleft()) # popQueue删除全部元素(通过头部元素),pushQueue按顺序加上全部元素
self.pushQueue, self.popQueue = self.popQueue, self.pushQueue
def pop(self) -> int:
return self.popQueue.popleft()
def top(self) -> int:
return self.popQueue[0]
def empty(self) -> bool:
return not self.popQueue