Python 手动实现堆栈与队列的数据结构详解
介绍在 Python 中基于类实现堆栈与队列数据结构的完整方法。通过定义初始化、入栈/队、出栈/队及状态判断的核心逻辑,结合可直接运行的示例代码,帮助开发者掌握基础数据结构的手工实现原理与实战用法。
Python 堆栈与队列的基础逻辑
堆栈遵循后进先出(LIFO)原则,队列遵循先进先出(FIFO)原则。虽然 Python 标准库提供了高效的内置集合,但手动实现有助于深入理解索引管理、边界条件判断与内存分配机制。下面分两步提供完整可运行代码及参数说明。
第1步:编写堆栈类并执行入栈与出栈测试
【目的】搭建固定容量的堆栈容器,验证元素进出顺序与空满状态判断。
【入口】新建 stack.py 文件并写入核心类,随后在同一或独立脚本中调用实例。
【动作与参数】初始化传入最大容量 size。使用 push(ele) 压入元素前触发 isfull() 校验,防止越界;使用 pop() 弹出元素前触发 isempty() 校验。
【完成状态】控制台无报错抛出,且 print(s.isempty()) 返回正确布尔值代表操作成功。
class Stack():
def __init__(self, size):
self.size = size
self.stack = []
self.top = -1
def push(self, ele):
if self.isfull():
raise Exception("out of range")
else:
self.stack.append(ele)
self.top += 1
def pop(self):
if self.isempty():
raise Exception("stack is empty")
else:
self.top -= 1
return self.stack.pop()
def isfull(self):
return self.top + 1 == self.size
def isempty(self):
return self.top == -1
导入并使用该类的测试代码如下:
#!/usr/bin/env python
from stack import Stack
s = Stack(20)
for i in range(3):
s.push(i)
s.pop()
print(s.isempty())
第2步:编写队列类并执行入队与出队测试
【目的】模拟固定长度数组下的队列行为,验证首尾指针的移动规律。
【入口】新建脚本文件直接定义 Queue 类并进行内联测试。
【动作与参数】初始化设置 front 与 rear 指针为 -1。入队 enqueue(ele) 追加至列表尾部并递增 rear;出队 dequeue() 递增 front 后读取当前索引元素。边界判断依赖 rear - front + 1 == self.size(满)与 front == rear(空)。
【完成状态】依次输出入队元素与最终的空状态检测结果,逻辑闭环无异常中断。
class Queue():
def __init__(self, size):
self.size = size
self.front = -1
self.rear = -1
self.queue = []
def enqueue(self, ele):
if self.isfull():
raise Exception("queue is full")
else:
self.queue.append(ele)
self.rear += 1
def dequeue(self):
if self.isempty():
raise Exception("queue is empty")
else:
self.front += 1
return self.queue[self.front]
def isfull(self):
return self.rear - self.front + 1 == self.size
def isempty(self):
return self.front == self.rear
q = Queue(10)
for i in range(3):
q.enqueue(i)
print(q.dequeue())
print(q.isempty())
关键注意事项与优化建议
上述代码采用原生列表模拟固定容量结构。实际开发中若频繁进行头部删除操作,建议将 pop(0) 替换为基于索引偏移的读取方式以规避 O(n) 的时间复杂度开销。此外,异常捕获建议使用标准的 Exception 基类而非小写拼写,确保在主流 Python 版本中稳定运行。
总结
以上就是在Python中手动实现堆栈与队列的详细内容,更多关于Python基础数据结构与面向对象开发的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













