Python之简单理解栈和队列

一、栈

1、栈的概念

栈是一种后进先出(LIFO, Last In First Out)的数据结构。

想象一摞盘子:

  • 你只能往最上面放盘子(入栈 / push)

  • 也只能从最上面拿盘子(出栈 / pop)

  • 最晚放上去的,最先被拿走

2、用列表的方法实现栈

3、示例:栈基础语法演示

python 复制代码
stack = []          # 空栈

stack.append(1)     # 入栈 1
print(stack)        # [1]

stack.append(2)     # 入栈 2
print(stack)        # [1, 2]

stack.append(3)     # 入栈 3
print(stack)        # [1, 2, 3]

top = stack.pop()   # 出栈 → 拿走最后一个
print(top)          # 3
print(stack)        # [1, 2]

top = stack.pop()   # 再出栈
print(top)          # 2
print(stack)        # [1]

print(stack[-1])    # 看栈顶,不删除 → 1

运行过程:

append(1): 1 放一个

append(2): 1, 2 再放一个

append(3): 1, 2, 3 再放一个

pop(): 1, 2 拿走 3(最后放的先被拿走)

pop(): 1 拿走 2

4、图文概括

二、队列

1、队列的概念

队列是一种先进先出(FIFO, First In First Out)的数据结构。

想象排队买奶茶:

  • 先来的人先买到(先进先出)

  • 后来的人后买到

  • 新来的人只能排在队尾

  • 买到的人从队头离开

2、单线程,推荐用collections.deque创建队列

(1)示例1:队列基础语法演示
python 复制代码
from collections import deque

q = deque()          # 空队列

q.append(1)          # 入队 1
print(q)             # deque([1])

q.append(2)          # 入队 2
print(q)             # deque([1, 2])

q.append(3)          # 入队 3
print(q)             # deque([1, 2, 3])

first = q.popleft()  # 出队 → 拿走最前面的
print(first)         # 1
print(q)             # deque([2, 3])

first = q.popleft()  # 再出队
print(first)         # 2
print(q)             # deque([3])

print(q[0])          # 看队头,不删除 → 3

运行过程:

append(1): 1 1 来排队

append(2): 1, 2 2 排到队尾

append(3): 1, 2, 3 3 排到队尾

popleft(): 2, 3 1 买完走了(最先来的先走)

popleft(): 3 2 买完走了

(2)示例2:打印任务队列
python 复制代码
from collections import deque

print_queue = deque()

# 三个人陆续提交打印任务
print_queue.append("小明的文档")
print_queue.append("小红的图片")
print_queue.append("小刚的表格")

print("当前排队:", print_queue)

# 打印机逐个处理
while print_queue:
    job = print_queue.popleft()
    print(f"正在打印:{job}")

print("所有任务完成!")

运行结果:

当前排队: '小明的文档', '小红的图片', '小刚的表格'

正在打印:小明的文档

正在打印:小红的图片

正在打印:小刚的表格

所有任务完成!

3、多线程,推荐用线程安全的队列 queue.Queue

python 复制代码
import queue
import threading
import time

q = queue.Queue()

def producer():
    for i in range(5):
        q.put(i)                    # 入队
        print(f"生产:{i}")
        time.sleep(0.3)

def consumer():
    while True:
        item = q.get()              # 出队
        print(f"消费:{item}")
        q.task_done()

t1 = threading.Thread(target=producer)
t2 = threading.Thread(target=consumer, daemon=True)
t1.start(); t2.start()
t1.join()
time.sleep(1)

4、图文概括

相关推荐
信誓旦旦的程序猿5 小时前
【Python量化实战宝典 #08】可转债与债券接口手册:转股价·溢价率·纯债价值(Python 可跑)
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
砚底藏山河5 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
今年下半年5 小时前
AI智能体项目实战记录(02):初始化 Python 项目
开发语言·人工智能·python·fastapi
Williamtym6 小时前
PickGo Lab实践:用浏览器、Python和MCP串起机器人搬运仿真
开发语言·python·机器人
CS创新实验室6 小时前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python
CCblandy6 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
quantdash_cc6 小时前
Pandas 处理分钟级股票行情:从原始数据清洗到 K 线聚合
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
把我格子衫拿来6 小时前
VTK 9.5 与 Qt 6 联合开发:从嵌入三维窗口到可维护的桌面架构
c++·python·qt·vtk·三维可视化
cpolar技术支持7 小时前
把配置发出去怕带出密钥?先把含凭据配置转成脱敏只读快照,用 cpolar 给同事核对差异
运维·python·内网穿透·cpolar·配置脱敏
惊讶的猫7 小时前
langchian_agent的高级使用
python