在python中堆栈数据结构

Fra*_*ery 28 python

我有以下代码的2个问题:

  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
    
    Run Code Online (Sandbox Code Playgroud)

Kim*_*ais 54

无需跳过这些循环,请参见5.1.1将列表用作堆栈

如果你坚持使用方法isEmpty(),push()你可以这样做:

class stack(list):
    def push(self, item):
        self.append(item)
    def isEmpty(self):
        return not self
Run Code Online (Sandbox Code Playgroud)

  • 一个基本问题:所有列表操作现在都可用,因此它更像是一个堆栈的装饰列表...... (4认同)
  • 为什么这是一个问题呢?如果弗兰基显然需要阻止人们捅内部,他可能会提到它. (4认同)

Mat*_* M. 23

您使用组合而不是继承是正确的,因为继承带来了您不希望公开的方法.

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()
Run Code Online (Sandbox Code Playgroud)

这样你的界面非常像list(pop例如相同的行为),除了你已经锁定它以确保没有人与内部混淆.

  • @denizensoft:这是关于保护自己免受Murphy,而不是Machiavelli.如果用户希望干涉内部并搞砸了事情,他们会把它带到自己身上; 但是如果因为API过于宽松而不小心插入前面,那么它就是API设计师的错误.通过限制API,可以更快地检测到错误(在这种情况下,会告诉您该方法不存在的异常). (3认同)

小智 11

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

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

有关详细信息,请参阅文档.它没有实现一个isEmpty()函数,如果无法完成推送或弹出,它会引发一个FullEmpty异常.


Sen*_*ran 6

堆栈遵循LIFO机制.您可以创建一个列表并执行法线append()以将元素附加到列表,并执行pop()从刚刚插入的列表中检索元素.


sum*_*dhe 5

这是堆栈类的示例

class Stack(object):

   def __init__(self):
      self.items = []

   def push(self, item):
      self.items.append(item)

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

   def peek(self):
       return self.items[-1]

   def isEmpty(self):
       return len(self.items) == 0
Run Code Online (Sandbox Code Playgroud)


Lah*_*oda 5

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

        def isEmpty(self):
            return self.items==[]

        def push(self , item):
            self.items.append(item)

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

        def size(self):
            return len(self.items)

        def peek(self):
            return self.items[-1]
Run Code Online (Sandbox Code Playgroud)

创建堆栈

要创建一个新堆栈,我们可以简单地使用 Stack()

例如:

     s=Stack()
Run Code Online (Sandbox Code Playgroud)

“s”是新堆栈的名称

是空的

通过使用isEmpty()我们可以检查我们的堆栈是否为空

例如:

我们有两个堆栈名称 s1=(0,1,4,5,6) 和 s2=()

如果我们使用 print(s1.isEmpty())它会返回False

如果我们使用 print(s2.isEmpty())它会返回True

通过使用推送操作,我们可以将项目添加到堆栈顶部

我们可以使用“6”添加到堆栈名称“s”

    s.push(6)
Run Code Online (Sandbox Code Playgroud)

流行音乐

我们可以使用 pop 操作移除并返回栈顶元素

如果有一个包含 n 个项目 (n>0) 的堆栈名称“s”,我们可以使用

    s.pop()
Run Code Online (Sandbox Code Playgroud)

尺寸

此操作将返回堆栈中的项目数

如果有一个栈名 "s" s=(1,2,3,4,5,3)

    print(s.size())
Run Code Online (Sandbox Code Playgroud)

将返回“6”

peek 这个操作返回最上面的项目而不删除它

    print(s.peek())
Run Code Online (Sandbox Code Playgroud)

“我们可以使用print(s.items)”打印堆栈中的项目