当前位置: 首页 > news >正文

人工智能之编程进阶 Python高级: 栈和队列

前言

列表(**list**)可以很方便地用作栈(Stack)队列(Queue)的底层实现,但它们的性能特性不同,适用于不同场景。本文详细讲解如何用list实现栈和队列,并指出最佳实践以及queue库的使用方式


一、用list实现栈(Stack)

✅ 栈的特点(LIFO:Last In, First Out)

  • 后进先出
  • 主要操作:压栈(push)弹栈(pop)

✅ 使用list实现栈(高效!)

Python 的list尾部(末尾)的操作是O(1)时间复杂度,因此用列表尾部作为栈顶是最高效的。

代码语言:python

AI代码解释

# 创建一个栈 stack = [] # 压栈(push)—— 使用 append() stack.append(1) stack.append(2) stack.append(3) print(stack) # [1, 2, 3] # 弹栈(pop)—— 使用 pop()(默认弹出最后一个) top = stack.pop() print(top) # 3 print(stack) # [1, 2] # 查看栈顶(不弹出) if stack: top = stack[-1] print("栈顶:", top) # 2 # 判断栈是否为空 if not stack: print("栈为空")

✅ 栈的典型应用

  • 括号匹配
  • 函数调用栈
  • 表达式求值(如后缀表达式)
  • 撤销操作(Undo)
示例:括号匹配

代码语言:python

AI代码解释

def is_valid_parentheses(s): stack = [] pairs = {')': '(', ']': '[', '}': '{'} for char in s: if char in '([{': stack.append(char) # 左括号入栈 else: if not stack or stack.pop() != pairs[char]: return False # 不匹配 return not stack # 栈空则匹配成功 print(is_valid_parentheses("([{}])")) # True print(is_valid_parentheses("([)]")) # False

结论:**list**非常适合实现栈!


二、用list实现队列(Queue)

⚠️ 队列的特点(FIFO:First In, First Out)

  • 先进先出
  • 主要操作:入队(enqueue)出队(dequeue)

❌ 用list实现队列的问题

如果用list头部作为队首(出队),尾部作为队尾(入队):

代码语言:python

AI代码解释

queue = [] # 入队(在尾部添加)—— O(1) queue.append('A') queue.append('B') queue.append('C') # 出队(从头部弹出)—— O(n) ❌ 低效! first = queue.pop(0) # 删除并返回第一个元素

问题list.pop(0)需要将后面所有元素向前移动一位,时间复杂度为O(n),数据量大时性能很差。


三、队列的正确实现方式

✅ 方案 1:使用collections.deque(推荐!)

deque(双端队列)在两端的操作都是O(1),是实现队列的最佳选择。

代码语言:python

AI代码解释

from collections import deque # 创建队列 queue = deque() # 入队(尾部添加)—— O(1) queue.append('A') queue.append('B') queue.append('C') # 出队(头部弹出)—— O(1) first = queue.popleft() print(first) # 'A' print(queue) # deque(['B', 'C']) # 查看队首(不弹出) if queue: front = queue[0] print("队首:", front) # 'B' # 判断队列是否为空 if not queue: print("队列为空")

✅ 方案 2:使用queue.Queue(线程安全)

适用于多线程环境:

代码语言:python

AI代码解释

from queue import Queue q = Queue() q.put('A') # 入队 q.put('B') item = q.get() # 出队(阻塞式) print(item) # 'A'

📌注意queue.Queue是线程安全的,但性能略低于deque,单线程程序推荐用deque


四、对比总结

操作

list(栈)

list(队列)

deque(队列)

尾部添加

append()O(1)

append()O(1)

append()O(1)

尾部弹出

pop()O(1)

pop()O(1)

头部添加

insert(0, x)O(n)

appendleft()O(1)

头部弹出

pop(0)O(n)

popleft()O(1)


五、实际应用示例

1. 用栈实现深度优先搜索(DFS)

代码语言:python

AI代码解释

def dfs_iterative(graph, start): visited = set() stack = [start] while stack: node = stack.pop() if node not in visited: print(node) visited.add(node) # 将邻居加入栈(顺序影响遍历方向) stack.extend(reversed(graph[node]))

2. 用队列实现广度优先搜索(BFS)

代码语言:python

AI代码解释

from collections import deque def bfs(graph, start): visited = set() queue = deque([start]) while queue: node = queue.popleft() if node not in visited: print(node) visited.add(node) queue.extend(graph[node])

六、最佳实践建议

场景

推荐数据结构

实现栈

list(使用append()pop())✅

实现队列

collections.deque(使用append()popleft())✅

多线程队列

queue.Queue

优先级队列

heapq模块

🔥记住栈 → 用list队列 → 用deque不要用list.pop(0)做队列!


七、扩展:自定义栈和队列类(可选)

代码语言:python

AI代码解释

# 自定义栈类 class Stack: def __init__(self): self._items = [] def push(self, item): self._items.append(item) def pop(self): if self.is_empty(): raise IndexError("pop from empty stack") return self._items.pop() def peek(self): if self.is_empty(): raise IndexError("peek from empty stack") return self._items[-1] def is_empty(self): return len(self._items) == 0 def size(self): return len(self._items) # 自定义队列类 from collections import deque class Queue: def __init__(self): self._items = deque() def enqueue(self, item): self._items.append(item) def dequeue(self): if self.is_empty(): raise IndexError("dequeue from empty queue") return self._items.popleft() def front(self): if self.is_empty(): raise IndexError("front from empty queue") return self._items[0] def is_empty(self): return len(self._items) == 0 def size(self): return len(self._items)

总结

本文主要介绍列表实现栈和队列。Python 的list实现栈的理想选择不适合实现队列(因pop(0)效率低), 队列应使用collections.deque,理解底层操作的时间复杂度,才能写出高性能代码!

http://www.jsqmd.com/news/461918/

相关文章:

  • 2026年湖北建筑资质办理:五家信誉与服务俱佳的代理机构推荐 - 2026年企业推荐榜
  • 对比一圈后 10个AI论文软件测评:自考毕业论文+开题报告高效写作工具推荐
  • 《构建之法》阅读笔记(一)
  • 哪家PCB加工专业
  • MacOS升级ruby版本
  • 为什么永远不会有语言取代 C / C++ ?
  • 2026苏州网站建设首选:亿韵商务/正规专业全解析
  • 2026年质量好的定制化等离子发生器厂家推荐:除尘除味等离子发生器厂家推荐及采购指南 - 行业平台推荐
  • 游戏骨骼系统:数字木偶的骨架奥秘
  • 【k8s】arm架构从零开始在线/离线部署k8s1.34.5+KubeSphere3.4.1 - 天行1st
  • 强烈建议尽快搞个软考证(新政策风口)
  • 响应错误: Indirect modification of overloaded element of app\model\StudentCacheModel has no effect
  • 【2025最新】基于SpringBoot+Vue的船运物流管理系统管理系统源码+MyBatis+MySQL
  • 2026年靠谱的除甲醛负离子发生器厂家推荐:高浓度负离子发生器优质供应商推荐(信赖) - 行业平台推荐
  • 【具身智能】技术群出炉!
  • CLion的配置
  • 携程任我行卡回收实时报价,回收途径三种方式 - 京回收小程序
  • Why does life originate from Africa.
  • WINCC初始化数据库连接卡在10%,无法加载,如何解决?
  • 诚悦橡塑管理水平怎么样,产品交货期准时且可信度高吗 - 工业品网
  • STM32入门(5)
  • 2026年重庆地区性价比高的叛逆少年教育学校推荐,树桥素质教育当选 - 工业设备
  • VR社区安全学习机|开启智慧社区新模式
  • 2026烟气分析仪选购指南:青岛明华等5家企业深度横评 - 品牌推荐大师1
  • 尊重用好所有手指:多元包容共生之道 ——在空论中看见,在时论中亲历,在共生中成为自己
  • VR科普学习一体机,在学校教育的应用前景
  • 电模温机专业供应商,选购时要注意什么? - 工业品牌热点
  • 告别高成本黑洞:营销云如何重塑B2B企业“降本增效”新范式? - 纷享销客智能型CRM
  • 多场景适配・洁净更高效:予华仪器超声波清洗设备优势全解读 - 品牌推荐大师1
  • 小龙虾openclaw的多模态能力扩展深度解析