我对如何制作堆栈感到困惑。这样可靠吗?

时间:2017-05-24 08:35:43

标签: python stack

stack = ["1", "2", "3"]
stack.append("4")
stack.append("6")
stack.pop()
print (stack)

这通常是我制作的方式,但我在这里看到其他类型的例子,并且无法判断我是否做得对。任何言论?

2 个答案:

答案 0 :(得分:0)

这是来自官方文档: https://docs.python.org/3/tutorial/datastructures.html

5.1.1。使用列表作为堆栈 列表方法使得将列表用作堆栈变得非常容易,其中添加的最后一个元素是检索到的第一个元素(“后进先出”)。要将项添加到堆栈顶部,请使用append()。要从堆栈顶部检索项目,请使用不带显式索引的pop()。例如:

>>> stack = [3, 4, 5]  
>>> stack.append(6)  
>>> stack.append(7)  
>>> stack  
[3, 4, 5, 6, 7]  
>>> stack.pop()  
7  
>>> stack  
[3, 4, 5, 6]  
>>> stack.pop()  
6  
>>> stack.pop()  
5  
>>> stack  
[3, 4]  

答案 1 :(得分:0)

你不是这样“堆叠”。

在您的示例中,您使用list实例作为堆栈,只需限制允许的方法数。这有点像在眼睛上蒙上眼睛,假装你是盲目的。

例如,不应使用

stack[i]stack.insert(i, x)。但type(stack)仍会返回<class 'list'>

>>> stack = ["1", "2", "3"]
>>> stack.append("4")
>>> stack.append("6")
>>> stack.pop()
'6'
>>> stack
['1', '2', '3', '4']
>>> type(stack)
<class 'list'>

所以这种方式并不可靠,因为没有什么可以阻止你在堆栈上调用list实例方法:

>>> stack.insert(0,'0')
>>> stack
['0', '1', '2', '3', '4']

如果您想限制stack对象可用的方法数量,可以围绕Stack编写list包装:

class Stack:

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

    def isEmpty(self):
        return 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 size(self):
        return len(self.items)

    def __str__(self):
        return str(self.items)


stack = Stack(["1", "2", "3"])
stack.push("4")
stack.push("6")
stack.pop()
print(stack)
# ['1', '2', '3', '4']
stack.insert(0, '0')
# AttributeError: Stack instance has no attribute 'insert'