数据结构 01 栈

2017-10-13  本文已影响32人  极光火狐狸

后进先出(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
上一篇 下一篇

猜你喜欢

热点阅读