End*_*age 11
如果您的堆栈可能会增长到很大的比例,您绝对不应该使用List自定义堆栈类.Raymond Hettinger已经为你完成了这项工作并写下了精彩的作品collections.deque.这deque是一个像数据结构的列表,支持从两端持续时间追加和弹出.
>>> from collections import deque
>>>
>>> stack = deque()
>>> stack.append(1)
>>> stack.append(2)
>>> stack.append(3)
>>> print stack
deque([1,2,3])
Run Code Online (Sandbox Code Playgroud)
然后适当地使用deque.pop(),deque.popleft()你可以分别实现FILO和FIFO.for item in stack如果需要FIFO或for item in reversed(stack)FILO,也可以迭代它,这将生成一个内存高效的反向迭代器.
正如其他人所说,Python 本身并没有真正内置的堆栈数据类型,但您可以使用列表来模拟它。
当使用列表作为堆栈时,您可以使用append()作为push和pop()作为pop来建模先进后出行为,如julio.alegria所描述的。
如果您想在 for 循环中使用该列表,但仍使其以 FILO 方式运行,您可以使用以下切片语法反转元素的顺序:[::-1]。
例子:
for element in stack[::-1]:
print element
Run Code Online (Sandbox Code Playgroud)
如果您使用实现堆栈的自定义类,只要它__iter__()定义next()了方法,您就可以在列表推导式、for 循环等中使用它。
这样,您就可以实现一个自定义迭代器,在迭代时删除项目,就像使用适当的堆栈一样。
例子:
class Stack:
def __init__(self):
self.data = []
def push(self,n):
self.data.append(n)
def pop(self):
return self.data.pop()
def __iter__(self):
return self
def next(self):
if len(self.data)>0:
return self.pop()
else:
raise StopIteration
filo = Stack()
filo.push(1)
filo.push(2)
filo.push(3)
for i in filo:
print i
Run Code Online (Sandbox Code Playgroud)