Я хотел бы поделиться своей версией реализации стека, которая наследует список Python. Я считаю, что итерация в стеке должна происходить в порядке 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()
Прежде всего, я реализовал его для решения проблемы программирования следующий больший элемент< /а>.
03.05.2019
def pop(self): return self.container.pop(-1)
08.08.2014self.container.pop()
. 06.05.2015show(self)
05.09.2018self.size()
не работает. Это должно быть либоself.container == []
, либоlen(self.container) == 0
01.01.2021size
:) В этом была проблема. 01.01.2021