在python中堆栈数据结构

时间:2011-01-14 07:32:01

标签: python

我对以下代码有两个问题:

  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 个答案:

答案 0 :(得分:54)

无需跳过这些循环,请参阅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

答案 1 :(得分:22)

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

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上的相同行为),除了你已经锁定它以确保没有人对内部构件感到困惑。

答案 2 :(得分:11)

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

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

有关详细信息,请参阅the docs。它没有实现isEmpty()函数,如果无法执行推送或弹出,它会引发FullEmpty异常。

答案 3 :(得分:6)

Stack遵循LIFO机制。您可以创建一个列表并执行一个普通的append()将元素追加到列表中并执行pop()以从您刚刚插入的列表中检索该元素。

答案 4 :(得分: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

答案 5 :(得分:3)

    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]

创建一个堆栈

要创建新堆栈,我们只需使用Stack()

即可

例如:

     s=Stack()

" S"是新堆栈的名称

<强>的isEmpty

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

例如:

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

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

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

<强>推

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

我们可以添加&#34; 6&#34;到堆栈名称&#34; s&#34;使用

    s.push(6)

<强>弹出

我们可以使用pop操作来删除并返回堆栈的顶部项目

如果有一个堆栈名称&#34; s&#34; n项金额(n> 0) 我们可以使用

删除它最重要的项目
    s.pop()

<强>大小

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

如果有一个堆栈名称&#34; s&#34; S =(1,2,3,4,5,3)

    print(s.size())

将返回&#34; 6&#34;

<强>偷看 此操作返回顶部项而不删除它

    print(s.peek())

&#34;我们可以使用print(s.items)&#34;

打印堆栈的项目

答案 6 :(得分:0)

class Stack:
    def __init__(self):
        self.stack = []
    def pop(self):
        if self.is_empty():
            return None
        else:
            return self.stack.pop()
    def push(self, d):
        return self.stack.append(d)
    def peek(self):
        if self.is_empty():
            return None
        else:
            return self.stack[-1]
    def size(self):
        return len(self.stack)
    def is_empty(self):
        return self.size() == 0

答案 7 :(得分:0)

类栈:

def __init__(self,n):##constructor

    self.no = n ##size of stack

    self.Stack = [] ##list for store stack items

    self.top = -1

def push(self):##push method
    if self.top == self.no - 1 :##check full condition
        print("Stack Overflow.....")
    else:
        n = int(input("enter an element :: "))
        self.Stack.append(n) ## in list add stack items use of append method
        self.top += 1##increment top by 1

def pop(self):## pop method

    if self.top == -1: #check empty condition
        print("Stack Underflow....")
    else:
        self.Stack.pop()## delete item from top of stack using pop method
        self.top -= 1 ## decrement top by 1

def peep(self): ##peep method
    print(self.top,"\t",self.Stack[-1]) ##display top item

def disp (self): #display method
    if self.top == -1:# check empty condition
        print("Stack Underflow....")
    else:
        print("TOP \tELEMENT")
        for i in range(self.top,-1,-1): ## print items and top
            print(i," \t",self.Stack[i])

n = int(input("Enter Size :: ")) # 栈的大小

stk = stack(n) ## 对象并将 n 作为大小传递

while(True): ## 循环选择作为 switch case

print(" 1: PUSH ")
print(" 2: POP ")
print(" 3: PEEP ")
print(" 4: PRINT ")
print(" 5: EXIT ")

option = int(input("enter your choice :: "))

if option == 1:
    stk.push()

elif option == 2:
    stk.pop()

elif option == 3:
    stk.peep()

elif option == 4:
    stk.disp()

elif option == 5:
    print("you are exit!!!!!")
    break
else:
    print("Incorrect option")