Python 实现简单队列与栈结构

2次阅读

python用list可高效实现(lifo),push/pop/peek均为o(1);队列若用list.pop(0)为o(n),应改用deque或手写滑动索引队列类,典型应用如括号匹配(栈)和bfs(队列)。

Python 实现简单队列与栈结构

用 Python 实现队列和,不需要依赖复杂库,靠列表(list)就能高效完成。核心在于理解两者操作逻辑:栈是“后进先出”(LIFO),队列是“先进先出”(FIFO);Python 列表的 append()pop() 天然适配栈,而队列若用 pop(0) 效率低,建议用 collections.deque封装简单类来规避性能问题。

用 list 快速实现栈

列表的末尾是栈顶,所有操作都在末端进行,时间复杂度 O(1):

  • push(item)list.append(item)
  • pop()list.pop()(默认弹出最后一个)
  • peek()list[-1](查看栈顶,不删除)
  • is_empty()len(list) == 0

示例:

stack = []<br>stack.append(1)  # push<br>stack.append(2)<br>top = stack[-1]   # peek → 2<br>popped = stack.pop()  # pop → 2<br>print(stack)  # [1]

避免用 list.pop(0) 实现队列

list.pop(0) 需要移动后续所有元素,最坏 O(n),不适合频繁出队。推荐两种更优方式:

立即学习Python免费学习笔记(深入)”;

  • 直接使用 collections.deque:双端队列,两端插入/删除都是 O(1)
  • 手动封装一个简易队列类,内部用 list + 索引偏移,避免移动元素(适合教学理解)

deque 示例:

from collections import deque<br>queue = deque()<br>queue.append(1)    # enqueue<br>queue.append(2)<br>front = queue[0]   # peek → 1<br>deq = queue.popleft()  # dequeue → 1

手写轻量队列类(无依赖,易理解)

用两个指针模拟“头尾滑动”,不实际删除元素,只更新索引,空间可复用:

  • 初始化时设 self.items = [None] * capacity(可选固定容量)或动态 list
  • 记录 self._front(当前队首位置)和 self._size(当前长度)
  • enqueue(item):在 self._front + self._size 处赋值
  • dequeue():返回 self.items[self._front],再 self._front += 1self._size -= 1

实际开发中更推荐 deque;手写类主要用于理解队列抽象逻辑和内存管理思想。

栈与队列的典型用途对比

知道“怎么实现”之后,明确“为什么用”能加深掌握:

  • 栈:函数调用栈、括号匹配、表达式求值、深度优先搜索(DFS)
  • 队列:任务调度、广度优先搜索(BFS)、消息缓冲、打印任务排队

例如括号匹配用栈——遇到左括号入栈,右括号时检查栈顶是否匹配并弹出;BFS 用队列——逐层扩展邻居节点,保证最近节点先被访问。

text=ZqhQzanResources