deque---一个类似列表的容器

阅读本篇教程,需要你具备一定的数据结构功底,否则,可能什么也看不懂。

很多人把collections模块下的deque说成是双端队列,这是极不准确的,标准模块里对它的定义如下

list-like container with fast appends and pops on either end

翻译过来应该是: 类似列表的容器,支持在两端快速的追加和删除元素。它是如此的灵活,提供了以下方法:

  • append (在末尾追加数据)
  • appendleft (在头部追加数据)
  • pop (删除并返回指定索引的数据,默认是末尾数据)
  • popleft(删除并返回头部数据)
  • insert(在指定位置插入数据)
  • remove(删除指定数据)

这些方法,已经远远超出了双端队列所能提供的方法,我个人对deque是这样理解的,它提供了及其灵活的功能,自身并不属于你所熟悉的任何一种数据结构,但我们可以在它的基础上非常轻松的实现数据结构,比如单向队列,双端队列,栈。

鉴于python标准库里已经实现了单向队列,所以本篇文章以deque为基础实现双端队列和栈这两种结构,向你展示如何使用deque

1. 实现双端队列

双端队列

代码实现

from collections import deque


class DoubleQueue():
    def __init__(self):
        self.queue = deque()

    def is_empty(self):
        """
        判断是否为空队列
        :return:
        """
        return len(self.queue) == 0

    def insert_front(self, data):
        """
        从队首插入数据
        :param data:
        :return:
        """
        self.queue.appendleft(data)

    def insert_rear(self, data):
        """
        从队尾插入数据
        :param data:
        :return:
        """
        self.queue.append(data)

    def delete_front(self):
        """
        从队首删除数据
        :return:
        """
        return self.queue.popleft()

    def delete_rear(self):
        """
        从队尾删除数据
        :return:
        """
        return self.queue.pop()

    def size(self):
        """
        返回队列长度
        :return:
        """
        return len(self.queue)


dq = DoubleQueue()

print(dq.is_empty())
dq.insert_front(4)
dq.insert_rear(5)
dq.insert_rear(6)

print(dq.delete_front())
print(dq.delete_rear())

print(dq.size())

2. 实现栈

代码实现

from collections import deque


class Stack:
    def __init__(self):
        self.stack = deque()

    def push(self, data):
        """
        入栈
        :param data:
        :return:
        """
        self.stack.append(data)

    def pop(self):
        """
        出栈
        :return:
        """
        return self.stack.pop()

    def size(self):
        """
        栈大小
        :return:
        """
        return len(self.stack)

    def is_empty(self):
        return self.size() == 0


stack = Stack()

stack.push(4)
stack.push(3)
stack.push(1)

print(stack.pop())
print(stack.size())

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案