python中的堆栈数据结构

2024-05-17 04:04:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  1. push(o)抛出异常TypeError:只能指定iterable。
  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
    

Tags: 代码selfreturnobjectinitstack堆栈def
3条回答

我不会讨论列表结构,因为这个问题已经讨论过了。相反,我将提到我处理堆栈的首选方法:

我总是使用Queue模块。它支持FIFO和LIFO数据结构,并且是线程安全的。

有关详细信息,请参见the docs。它不实现isEmpty()函数,而是在无法执行推送或弹出时引发FullEmpty异常。

不需要跳过这些循环,请参见5.1.1 Using Lists as Stacks

如果您坚持使用方法isEmpty()push(),您可以:

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

使用组合而不是继承是正确的,因为继承带来了不想公开的方法。

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上的行为相同)非常相似,只是您已将其锁定以确保没有人弄乱内部。

相关问题 更多 >