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

用 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 += 1,self._size -= 1
实际开发中更推荐 deque;手写类主要用于理解队列抽象逻辑和内存管理思想。
栈与队列的典型用途对比
知道“怎么实现”之后,明确“为什么用”能加深掌握:
- 栈:函数调用栈、括号匹配、表达式求值、深度优先搜索(DFS)
- 队列:任务调度、广度优先搜索(BFS)、消息缓冲、打印任务排队
例如括号匹配用栈——遇到左括号入栈,右括号时检查栈顶是否匹配并弹出;BFS 用队列——逐层扩展邻居节点,保证最近节点先被访问。