我想分享我继承 Python List 的堆栈实现版本。我相信堆栈上的迭代应该以 LIFO 顺序发生。此外,pop-all()
在弹出所有元素时,应该提供一个迭代来迭代。我还添加stack.clear()
了清空堆栈(就像我们deque.clear()
在集合模块中一样)。我还__repr__
为调试目的覆盖:
class Stack(list):
def push(self, item):
self.append(item)
def top(self):
return self[-1]
def size(self):
return len(self)
def isempty(self):
return self.size() == 0
def __iter__(self):
""" iter in lifo """
return super(Stack, self).__reversed__()
def __reversed__(self):
return super(Stack, self).__iter__()
def popall(self):
try:
while True:
yield self.pop()
except IndexError:
pass
def clear(self):
del self[:]
def __repr__(self):
if not self:
return '%s()' % self.__class__.__name__
return '%s(%s)' % (self.__class__.__name__, super(Stack, self).__repr__())
以下是如何使用它:
stack = Stack(range(5))
print "stack: ", stack # stack: Stack([0, 1, 2, 3, 4])
print "stack.pop() => ", stack.pop() # stack.pop() => 4
print "stack.push(20) " # stack.push(20)
stack.push(20)
for item in stack:
print item # prints 20, 3, 2... in newline
print "stack: ", stack # stack: Stack([0, 1, 2, 3, 20])
print "stack pop all..."
for item in stack.popall(): # side effect to clear stack
print item
print "stack: ", stack # stack: Stack()
主要的,我实现了它来解决下一个更大的元素的编程问题。