551 字
3 分钟
代码随想录算法训练营第九天 | 栈与队列 Part01
栈与队列基础
- 栈(Stack)和队列(Queue)是两种重要的数据结构,广泛应用于算法和数据处理。
- 栈是后进先出(LIFO)的数据结构,队列是先进先出(FIFO)的数据结构。
- 栈的基本操作包括入栈(push)、出栈(pop)和查看栈顶元素(top)。
- 队列的基本操作包括入队(enqueue)、出队(dequeue)和查看队头元素(front)。
栈与队列的经典应用场景:
- 栈:函数递归、括号匹配、字符串去重等;
- 队列:按顺序处理任务、窗口滑动、图的广度优先遍历;
- 同时掌握“栈模拟队列”、“队列模拟栈”等面试高频技巧。
232. 用栈实现队列
class MyQueue: def __init__(self): self.stack1 = [] # 负责入队 self.stack2 = [] # 负责出队
def push(self, x: int) -> None: self.stack1.append(x)
def pop(self) -> int: if self.empty(): return None if self.stack2: return self.stack2.pop() else: # 只有在 stack2 为空时,才将 stack1 所有元素倒入 stack2 while self.stack1: self.stack2.append(self.stack1.pop()) return self.stack2.pop()
def peek(self) -> int: # 先执行出队操作但不真正移除,再将值放回 stack2 中 res = self.pop() self.stack2.append(res) return res
def empty(self) -> bool: return not (self.stack1 or self.stack2)
225. 用队列实现栈
from collections import deque
class MyStack:
def __init__(self): self.q1 = deque() # 主队列 self.q2 = deque() # 辅助队列
def push(self, x: int) -> None: self.q1.append(x)
def pop(self) -> int: # 将 q1 中前 n-1 个元素转移到 q2,保留最后一个 while len(self.q1) > 1: self.q2.append(self.q1.popleft()) res = self.q1.popleft() # 交换 q1 和 q2 的角色 self.q1, self.q2 = self.q2, self.q1 return res
def top(self) -> int: res = self.pop() self.q1.append(res) return res
def empty(self) -> bool: return len(self.q1) == 0
20. 有效的括号
class Solution: def isValid(self, s: str) -> bool: stack = [] for char in s: if char in "({[": stack.append(char) elif stack: top = stack.pop() if char == ')' and top != '(': return False if char == '}' and top != '{': return False if char == ']' and top != '[': return False else: # 栈为空但遇到右括号,说明无效 return False return len(stack) == 0
1047. 删除字符串中的所有相邻重复项
class Solution: def removeDuplicates(self, s: str) -> str: stack = [] for char in s: if not stack: stack.append(char) else: top = stack.pop() if char != top: stack.append(top) stack.append(char) return ''.join(stack)
代码随想录算法训练营第九天 | 栈与队列 Part01
https://fuwari.vercel.app/posts/code_musings_day_nine/