使用 Python 实现一个简单的栈(Stack)类
快速解决
使用 Python 列表实现一个栈类,包含 push、pop、peek 等核心方法。这个实现满足 LIFO(后进先出)特性,适合需要临时存储和倒序处理数据的场景。
class Stack:
def __init__(self):
self.items = []
def push(self, item): # 将元素添加到栈顶
self.items.append(item)
def pop(self): # 移除并返回栈顶元素
if not self.is_empty():
return self.items.pop()
raise IndexError("Pop from empty stack")
def peek(self): # 返回栈顶元素但不移除
if not self.is_empty():
return self.items[-1]
raise IndexError("Peek from empty stack")
def is_empty(self): # 检查栈是否为空
return len(self.items) == 0
def size(self): # 返回栈的大小
return len(self.items)
常用方法
| 方法名称 | 功能说明 | 使用频率 | 参数类型 | 返回类型 |
|---|---|---|---|---|
| push | 元素入栈 | ★★★★★ | any | None |
| pop | 元素出栈 | ★★★★★ | - | any |
| peek | 查看栈顶元素 | ★★★★☆ | - | any |
| is_empty | 判断栈是否为空 | ★★★★☆ | - | bool |
| size | 获取栈内元素数量 | ★★★☆☆ | - | int |
| clear | 清空栈 | ★★☆☆☆ | - | None |
| str | 获取栈字符串表示形式 | ★★☆☆☆ | - | str |
详细说明
push 方法
将元素添加到栈顶,底层使用列表的 append 方法实现。代码示例:
def push(self, item):
self.items.append(item) # 列表尾部添加元素,时间复杂度 O(1)
pop 方法
移除并返回栈顶元素,需先检查栈是否为空:
def pop(self):
if not self.is_empty():
return self.items.pop() # 列表尾部删除元素,时间复杂度 O(1)
raise IndexError("Pop from empty stack")
is_empty 方法
通过判断列表长度是否为 0 来确认栈状态:
def is_empty(self):
return len(self.items) == 0 # 时间复杂度 O(1)
高级技巧
1. 异常处理优化
在 pop/peek 方法中添加用户自定义异常,提高错误信息可读性:
class StackEmptyError(Exception):
pass
def pop(self):
if not self.is_empty():
return self.items.pop()
raise StackEmptyError("Stack is empty") # 自定义异常类型
2. 栈容量控制
添加最大容量限制,实现栈满检查:
class Stack:
def __init__(self, max_size=100):
self.items = []
self.max_size = max_size # 设置最大容量
def is_full(self):
return len(self.items) == self.max_size # 判断是否已满
3. 实际应用场景
用栈实现括号匹配验证:
def is_valid_parentheses(s):
stack = Stack()
for char in s:
if char in "({[":
stack.push(char) # 左括号入栈
elif char in ")}]":
if stack.is_empty(): # 空栈遇到右括号直接失败
return False
top = stack.pop() # 匹配右括号与栈顶左括号
if not matches(top, char): # 自定义匹配函数
return False
return stack.is_empty() # 栈空表示全部匹配
常见问题
Q1:为什么选择列表而不是其他数据结构实现栈?
A1:Python 列表的尾部操作(append/pop)时间复杂度为 O(1),头操作(insert/delete at 0)是 O(n),选择尾部操作更高效。
Q2:如何避免 pop 时栈为空导致的错误?
A2:在调用 pop 前使用 is_empty 方法检查,或捕获 StackEmptyError 异常处理。
Q3:这个实现与 Python 的 list 有什么本质区别?
A3:Stack 类封装了接口,增加了异常处理和方法语义(push/pop 明确表示栈操作),而 list 是通用数据结构。
总结
本文提供了一个可直接使用的 Python 栈类实现,包含核心方法、异常处理和实际应用场景,帮助开发者快速构建符合 LIFO 特性的数据结构。