使用 Python 实现一个简单的栈(Stack)类(最佳实践)

使用 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 特性的数据结构。