数据结构 03 双向队列

双向队列

它是一种混合线性数据结构, 涵盖Stack和Queue的全部能力.

# -.- 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 Deque(object):

    """
    Deuque: 双向队列

    它是一种混合线性数据结构, 涵盖Stack和Queue的全部能力.
    """

    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

    def insert(self, item):
        self.items.insert(0, item)
        return self.items

    @checker
    def __leftpop(self):
        return self.items.pop(0)

    @checker
    def __rightpop(self):
        return self.items.pop(-1)

    def get(self):
        return self.__leftpop()

    def rightget(self):
        return self.__rightpop()

    @checker
    def peek(self):
        return self.items[0]

    @checker
    def rightpeek(self):
        return self.items[-1]

    def __iter__(self):
        return self

    def __next__(self):
        if not self.empty():
            return self.get()
        raise StopIteration

    def next(self):
        return self.__next__()

    def __str__(self):
        return "{}".format(self.items)


if __name__ == '__main__':
    deque = Deque()

    # 插入测试数据
    deque.append("a")
    deque.append("b")
    deque.append("c")
    deque.insert("x")
    deque.insert("y")
    deque.insert("z")

    # 测试功能
    print("查看双向队列: ", deque)
    print("获取头元素(不移除元素): ", deque.peek())
    print("查看双向队列: ", deque)
    print("获取头元素(移除元素): ", deque.get())
    print("查看双向队列: ", deque)
    print("获取尾元素(不移除元素): ", deque.rightpeek())
    print("查看双向队列: ", deque)
    print("获取尾元素(移除元素): ", deque.rightget())
    print("查看双向队列: ", deque)

    # 遍历栈对象
    for enum, i in enumerate(deque):
        print("遍历第{}个元素: ".format(enum), i)

    # 输出结果
    # 查看双向队列:  ['z', 'y', 'x', 'a', 'b', 'c']
    # 获取头元素(不移除元素):  z
    # 查看双向队列:  ['z', 'y', 'x', 'a', 'b', 'c']
    # 获取头元素(移除元素):  z
    # 查看双向队列:  ['y', 'x', 'a', 'b', 'c']
    # 获取尾元素(不移除元素):  c
    # 查看双向队列:  ['y', 'x', 'a', 'b', 'c']
    # 获取尾元素(移除元素):  c
    # 查看双向队列:  ['y', 'x', 'a', 'b']
    # 遍历第0个元素:  y
    # 遍历第1个元素:  x
    # 遍历第2个元素:  a
    # 遍历第3个元素:  b
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文内容取自于小甲鱼的数据结构与算法。http://www.jianshu.com/p/230e6fde9c75 ...
    阿阿阿阿毛阅读 8,044评论 0 7
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,348评论 30 472
  • 容器的概念所谓STL容器,即是将最常运用的一些数据结构(data structures)实现出来。容器是指容纳特定...
    饭饭H阅读 2,920评论 0 0
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,530评论 25 709
  • 文□程小刀 “听好了哈,离魂术讲究天时地利人和,把握好这些才能施展术法。”天使熊熊一本正经的给它心仪的天使花花讲...
    小刀君阅读 5,120评论 0 0