Python中如何实现双端队列Dequeue

发布时间:2021-12-18 10:27:21 作者:小新
来源:亿速云 阅读:202

Python中如何实现双端队列Dequeue

双端队列(Dequeue,全称Double-Ended Queue)是一种具有队列和栈性质的数据结构,允许在队列的两端进行插入和删除操作。与普通队列(只能在队尾插入,队头删除)不同,双端队列可以在队头和队尾同时进行插入和删除操作。这种灵活性使得双端队列在很多场景下非常有用,例如实现滑动窗口、缓存管理等。

在Python中,双端队列可以通过多种方式实现。本文将介绍如何使用Python内置的collections.deque模块以及如何手动实现一个双端队列。

1. 使用collections.deque实现双端队列

Python的标准库collections模块中提供了一个名为deque的类,专门用于实现双端队列。deque类提供了高效的双端操作,时间复杂度为O(1)。

1.1 创建双端队列

首先,我们需要导入deque类:

from collections import deque

然后,我们可以通过以下方式创建一个双端队列:

d = deque()

也可以初始化时传入一个可迭代对象:

d = deque([1, 2, 3, 4])

1.2 在队头和队尾插入元素

deque提供了append()appendleft()方法,分别用于在队尾和队头插入元素:

d.append(5)  # 在队尾插入元素5
d.appendleft(0)  # 在队头插入元素0

1.3 在队头和队尾删除元素

deque提供了pop()popleft()方法,分别用于在队尾和队头删除元素:

d.pop()  # 删除队尾元素
d.popleft()  # 删除队头元素

1.4 其他常用操作

1.5 示例代码

from collections import deque

# 创建双端队列
d = deque([1, 2, 3, 4])

# 在队尾插入元素
d.append(5)
print(d)  # 输出: deque([1, 2, 3, 4, 5])

# 在队头插入元素
d.appendleft(0)
print(d)  # 输出: deque([0, 1, 2, 3, 4, 5])

# 删除队尾元素
d.pop()
print(d)  # 输出: deque([0, 1, 2, 3, 4])

# 删除队头元素
d.popleft()
print(d)  # 输出: deque([1, 2, 3, 4])

# 旋转队列
d.rotate(2)
print(d)  # 输出: deque([3, 4, 1, 2])

2. 手动实现双端队列

虽然collections.deque已经提供了高效的双端队列实现,但为了深入理解双端队列的工作原理,我们可以手动实现一个简单的双端队列。

2.1 使用列表实现双端队列

Python的列表(list)可以用于实现双端队列,但由于列表在头部插入和删除元素的时间复杂度为O(n),因此效率较低。不过,对于小规模数据,列表仍然是一个可行的选择。

2.1.1 实现代码

class Deque:
    def __init__(self):
        self.items = []

    def is_empty(self):
        return len(self.items) == 0

    def append(self, item):
        self.items.append(item)

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

    def pop(self):
        if self.is_empty():
            raise IndexError("pop from empty deque")
        return self.items.pop()

    def popleft(self):
        if self.is_empty():
            raise IndexError("popleft from empty deque")
        return self.items.pop(0)

    def __len__(self):
        return len(self.items)

    def __getitem__(self, index):
        return self.items[index]

    def __repr__(self):
        return f"Deque({self.items})"

2.1.2 示例代码

d = Deque()

# 在队尾插入元素
d.append(1)
d.append(2)
print(d)  # 输出: Deque([1, 2])

# 在队头插入元素
d.appendleft(0)
print(d)  # 输出: Deque([0, 1, 2])

# 删除队尾元素
d.pop()
print(d)  # 输出: Deque([0, 1])

# 删除队头元素
d.popleft()
print(d)  # 输出: Deque([1])

2.2 使用双向链表实现双端队列

为了在双端队列的两端都实现O(1)时间复杂度的插入和删除操作,我们可以使用双向链表来实现双端队列。

2.2.1 实现代码

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None
        self.prev = None

class Deque:
    def __init__(self):
        self.head = None
        self.tail = None
        self.size = 0

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

    def append(self, value):
        new_node = Node(value)
        if self.is_empty():
            self.head = self.tail = new_node
        else:
            self.tail.next = new_node
            new_node.prev = self.tail
            self.tail = new_node
        self.size += 1

    def appendleft(self, value):
        new_node = Node(value)
        if self.is_empty():
            self.head = self.tail = new_node
        else:
            new_node.next = self.head
            self.head.prev = new_node
            self.head = new_node
        self.size += 1

    def pop(self):
        if self.is_empty():
            raise IndexError("pop from empty deque")
        value = self.tail.value
        if self.size == 1:
            self.head = self.tail = None
        else:
            self.tail = self.tail.prev
            self.tail.next = None
        self.size -= 1
        return value

    def popleft(self):
        if self.is_empty():
            raise IndexError("popleft from empty deque")
        value = self.head.value
        if self.size == 1:
            self.head = self.tail = None
        else:
            self.head = self.head.next
            self.head.prev = None
        self.size -= 1
        return value

    def __len__(self):
        return self.size

    def __repr__(self):
        values = []
        current = self.head
        while current:
            values.append(current.value)
            current = current.next
        return f"Deque({values})"

2.2.2 示例代码

d = Deque()

# 在队尾插入元素
d.append(1)
d.append(2)
print(d)  # 输出: Deque([1, 2])

# 在队头插入元素
d.appendleft(0)
print(d)  # 输出: Deque([0, 1, 2])

# 删除队尾元素
d.pop()
print(d)  # 输出: Deque([0, 1])

# 删除队头元素
d.popleft()
print(d)  # 输出: Deque([1])

3. 总结

本文介绍了如何在Python中实现双端队列。首先,我们使用collections.deque模块快速实现了一个高效的双端队列。然后,我们手动实现了两种双端队列:基于列表的实现和基于双向链表的实现。虽然collections.deque已经提供了高效的双端队列实现,但手动实现有助于我们更好地理解双端队列的工作原理。

在实际应用中,建议优先使用collections.deque,因为它不仅高效,而且经过了充分的测试和优化。

推荐阅读:
  1. Python数据类型:双端队列deque-比列表list性能更高的一种数据类型
  2. python中如何实现累加

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python dequeue

上一篇:Gruntfile.js怎么使用

下一篇:如何进行springboot配置templates直接访问的实现

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》