Python中的栈数据结构

32 投票
8 回答
78238 浏览
提问于 2025-04-16 09:56

我对下面的代码有两个问题:

  1. 调用 push(o) 时出现了一个错误,提示 TypeError: 只能分配可迭代对象
  2. 如果在一个空的栈上调用 pop(),我应该抛出一个异常吗?

    class Stack(object):
    
        def __init__(self):
            self.storage = []
    
        def isEmpty(self):
            return len(self.storage) == 0
    
        def push(self,p):
            self.storage[:0] = p
    
        def pop(self):
            """issue: throw exception?"""
            return None
    

8 个回答

11

我不打算讨论列表结构,因为这个问题里已经讲过了。相反,我想分享一下我处理栈的偏好方法:

我总是使用 Queue 模块。它支持先进先出(FIFO)和后进先出(LIFO)这两种数据结构,并且是线程安全的。

想了解更多信息,可以查看 官方文档。这个模块没有提供 isEmpty() 这个函数,而是会在无法进行添加或删除操作时,抛出 FullEmpty 的异常。

25

你说得对,使用组合而不是继承是个好主意,因为继承会带来一些你不想公开的方法。

class Stack:
  def __init__(self):
    self.__storage = []

  def isEmpty(self):
    return len(self.__storage) == 0

  def push(self,p):
    self.__storage.append(p)

  def pop(self):
    return self.__storage.pop()

这样一来,你的接口就像是 list 一样工作(比如在 pop 方法上的表现是一样的),不过你已经锁定了它,确保没人能乱动内部的东西。

59

没必要绕来绕去,直接看看这个链接:5.1.1 使用列表作为栈

如果你还是想要有 isEmpty()push() 这两个方法,你可以这样做:

class stack(list):
    def push(self, item):
        self.append(item)
    def isEmpty(self):
        return not self

撰写回答