使用列表实现栈高效,因append和pop操作均为O(1);但用列表实现队列时,pop(0)为O(n),性能差。应使用collections.deque实现队列,因其popleft为O(1)。封装类可提供更清晰接口和错误处理,适用于复杂场景。频繁出队或大数据量时优选deque,简单栈操作可选list。

在Python中实现栈(Stack)和队列(Queue)有几种常见且有效的方法,最直接的方式是利用Python内置的列表(list)或
collections
deque
实现栈(LIFO,后进先出)和队列(FIFO,先进先出)的核心在于控制元素的添加和移除顺序。
1. 使用Python列表实现栈
Python的
list
append()
pop()
立即学习“Python免费学习笔记(深入)”;
# 栈的实现示例
stack = []
# 入栈 (Push)
stack.append('A')
stack.append('B')
stack.append('C')
print(f"入栈后: {stack}") # 输出: ['A', 'B', 'C']
# 出栈 (Pop)
item_c = stack.pop()
print(f"出栈 {item_c} 后: {stack}") # 输出: ['A', 'B']
item_b = stack.pop()
print(f"出栈 {item_b} 后: {stack}") # 输出: ['A']
# 查看栈顶元素 (Peek)
if stack:
print(f"栈顶元素: {stack[-1]}") # 输出: 'A'
# 检查栈是否为空
print(f"栈是否为空: {not stack}") # 输出: False2. 使用collections.deque
虽然列表也可以实现队列,但它在从列表头部移除元素时效率较低(
list.pop(0)
collections.deque
deque
from collections import deque
# 队列的实现示例
queue = deque()
# 入队 (Enqueue)
queue.append('Task1')
queue.append('Task2')
queue.append('Task3')
print(f"入队后: {queue}") # 输出: deque(['Task1', 'Task2', 'Task3'])
# 出队 (Dequeue)
task1 = queue.popleft() # 从左端移除
print(f"出队 {task1} 后: {queue}") # 输出: deque(['Task2', 'Task3'])
task2 = queue.popleft()
print(f"出队 {task2} 后: {queue}") # 输出: deque(['Task3'])
# 查看队首元素 (Peek)
if queue:
print(f"队首元素: {queue[0]}") # 输出: 'Task3'
# 检查队列是否为空
print(f"队列是否为空: {not queue}") # 输出: False说实话,用Python的内置
list
append()
pop()
list
但当
list
list.pop(0)
pop(0)
list.pop(0)
list.pop(0)
虽然直接使用
list
deque
push
pop
enqueue
dequeue
下面是两个简单的类封装示例:
class MyStack:
def __init__(self):
# 内部使用列表存储栈元素
self._items = []
def push(self, item):
"""元素入栈"""
self._items.append(item)
def pop(self):
"""元素出栈,如果栈为空则抛出错误"""
if not self._items:
raise IndexError("pop from empty stack")
return self._items.pop()
def peek(self):
"""查看栈顶元素,不移除"""
if not self._items:
raise IndexError("peek from empty stack")
return self._items[-1]
def is_empty(self):
"""判断栈是否为空"""
return not self._items
def size(self):
"""返回栈中元素数量"""
return len(self._items)
def __str__(self):
return f"Stack({self._items})"
def __repr__(self):
return self.__str__()
# 使用自定义栈
s = MyStack()
s.push(10)
s.push(20)
print(f"我的栈: {s}")
print(f"栈顶元素: {s.peek()}")
print(f"出栈: {s.pop()}")
print(f"栈是否为空: {s.is_empty()}")
print(f"栈大小: {s.size()}")
# s.pop()
# s.pop() # 再次pop会引发IndexError
from collections import deque
class MyQueue:
def __init__(self):
# 内部使用collections.deque存储队列元素,保证高效性
self._items = deque()
def enqueue(self, item):
"""元素入队"""
self._items.append(item)
def dequeue(self):
"""元素出队,如果队列为空则抛出错误"""
if not self._items:
raise IndexError("dequeue from empty queue")
return self._items.popleft()
def peek(self):
"""查看队首元素,不移除"""
if not self._items:
raise IndexError("peek from empty queue")
return self._items[0]
def is_empty(self):
"""判断队列是否为空"""
return not self._items
def size(self):
"""返回队列中元素数量"""
return len(self._items)
def __str__(self):
return f"Queue({list(self._items)})" # 转换为列表方便打印
def __repr__(self):
return self.__str__()
# 使用自定义队列
q = MyQueue()
q.enqueue('JobA')
q.enqueue('JobB')
print(f"我的队列: {q}")
print(f"队首元素: {q.peek()}")
print(f"出队: {q.dequeue()}")
print(f"队列是否为空: {q.is_empty()}")
print(f"队列大小: {q.size()}")
# q.dequeue()
# q.dequeue() # 再次dequeue会引发IndexError通过类封装,我们不仅拥有了更直观的API,还可以在方法内部加入各种逻辑,比如在
pop()
dequeue()
collections.deque
这是一个很实际的问题,选择哪种数据结构确实需要根据具体场景来定。在我看来,
collections.deque
选择collections.deque
deque
list.pop(0)
deque.popleft()
deque
deque
append()
appendleft()
pop()
popleft()
deque
deque
maxlen
选择普通列表(list
append()
pop()
list
deque
list.pop(0)
my_list[index]
deque
总的来说,当涉及到队列操作,尤其是需要从头部移除元素时,
collections.deque
以上就是如何用Python实现栈和队列?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号