栈
后进先出(LIFO: Last In First Out)
# -.- coding:utf-8 -.-
from __future__ import print_function
def checker(func):
def wrapper(self, *args, **kwargs):
if self.empty():
return self.items
return func(self, *args, **kwargs)
return wrapper
class Stack(object):
"""栈: 有序, 后进先出"""
def __init__(self):
self.items = []
def size(self):
"""获取栈元素总数."""
return len(self.items)
def empty(self):
"""栈为空则返回: True ; 栈非空返回: False"""
return not self.size()
def append(self, item):
"""在栈的最末端增加一个元素."""
self.items.append(item)
return self.items
@checker
def peek(self):
"""在栈的最末端获取一个元素, 不做移除动作."""
return self.items[-1]
@checker
def get(self):
"""在栈的最末端获取一个元素, 并移除该元素."""
return self.items.pop()
def __iter__(self):
"""让栈支持迭代"""
return self
def __next__(self):
"""Python3: 让栈支持for循环"""
if not self.empty():
return self.get()
raise StopIteration
def next(self):
"""Python2: 让栈支持for循环"""
return self.__next__()
def __str__(self):
"""让栈支持print打印结果"""
return "{}".format(self.items)
if __name__ == '__main__':
# 创建一个栈对象.
stack = Stack()
# 为栈对象增加几个元素
stack.append('a')
stack.append('b')
stack.append('c')
stack.append('d')
stack.append('e')
# 查看栈对象
print("查看栈对象: ", stack)
# 获取栈对象的一个元素
print("获取栈对象的一个元素: ", stack.get())
# 查看栈对象
print("查看栈对象: ", stack)
# 遍历栈对象
for enum, i in enumerate(stack):
print("遍历第{}个元素: ".format(enum), i)
# 输出结果
# 查看栈对象: ['a', 'b', 'c', 'd', 'e']
# 获取栈对象的一个元素: e
# 查看栈对象: ['a', 'b', 'c', 'd']
# 遍历第0个元素: d
# 遍历第1个元素: c
# 遍历第2个元素: b
# 遍历第3个元素: a