Python中的栈数据结构
我对下面的代码有两个问题:
- 调用 push(o) 时出现了一个错误,提示 TypeError: 只能分配可迭代对象。
如果在一个空的栈上调用 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()
这个函数,而是会在无法进行添加或删除操作时,抛出 Full
或 Empty
的异常。
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