很多人把 collections
模块下的 deque
说成是双端队列,这是极不准确的,
标准模块里对它的定义如下:
list-like container with fast appends and pops on either end
翻译过来应该是: 类似列表的容器,支持在两端快速的追加和删除元素。它是如此的灵活,提供了以下方法:
append
(在末尾追加数据)appendleft
(在头部追加数据)pop
(删除并返回指定索引的数据,默认是末尾数据)popleft
(删除并返回头部数据)insert
(在指定位置插入数据)remove
(删除指定数据)
这些方法,已经远远超出了双端队列所能提供的方法, 它提供了极其灵活的功能,自身并不属于你所熟悉的任何一种数据结构, 但可以在它的基础上非常轻松的实现数据结构,比如单向队列,双端队列,栈。
鉴于python标准库里已经实现了单向队列,所以本篇文章以 deque
为基础实现双端队列和栈这两种结构,
向你展示如何使用 deque
。
实现双端队列
deque
本身就是为双端操作设计的。
代码实现:
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())
True
dq.insert_front(4)
dq.insert_rear(5)
dq.insert_rear(6)
print(dq.delete_front())
4
print(dq.delete_rear())
6
print(dq.size())
1
代码实现:
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())
1
print(stack.size())
2