📜  Python|使用双向链表进行队列(1)

📅  最后修改于: 2023-12-03 15:19:18.146000             🧑  作者: Mango

Python|使用双向链表进行队列

介绍

在Python中,我们可以使用双向链表来实现队列数据结构。队列是一种先进先出(First In First Out,简称FIFO)的数据结构,而双向链表是一种链表结构,它同时有前向和后向指针,可以双向遍历。

双向链表可以在队列头和队列尾进行操作,而且它的插入和删除操作的效率非常高。所以,使用双向链表来实现队列可以提高队列的效率。

如何使用双向链表实现队列

我们可以使用Python内置的collections模块中的deque类来实现双向队列。deque类是一个双向队列(即可以在队列头和队列尾进行操作),它的实现是基于双向链表的。下面是一个简单的例子:

from collections import deque

q = deque()
q.append('a')
q.append('b')
q.append('c')
print(q)  # deque(['a', 'b', 'c'])
print(q.popleft())  # a
print(q.popleft())  # b
print(q)  # deque(['c'])

在上面的例子中,我们首先通过deque()创建了一个空的双向队列q,然后使用append()函数向队列里面添加元素,使用popleft()函数从队列头部删除元素。运行结果如下:

deque(['a', 'b', 'c'])
a
b
deque(['c'])
自定义一个双向链表实现队列

除了使用Python内置的collections模块中的deque类之外,我们还可以自定义一个双向链表来实现队列。下面是一个简单的例子:

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

class Queue:
    def __init__(self):
        self.head = Node()
        self.tail = Node()
        self.head.next = self.tail
        self.tail.prev = self.head
    
    def enqueue(self, data):
        new_node = Node(data)
        new_node.prev = self.tail.prev
        new_node.next = self.tail
        self.tail.prev.next = new_node
        self.tail.prev = new_node
    
    def dequeue(self):
        if self.head.next == self.tail:
            return None
        first_node = self.head.next
        self.head.next = first_node.next
        first_node.next.prev = self.head
        return first_node.data

在上面的例子中,我们首先定义了一个Node类来表示链表中的节点,它包含三个属性:data表示节点中存储的数据,prev表示该节点的前向指针,next表示该节点的后向指针。

然后我们定义了一个Queue类来表示队列,它包含两个属性:head表示队列头节点,tail表示队列尾节点。在创建队列的时候,我们要将headtail连接成一个双向链表。

enqueue()函数中,我们首先创建一个新节点new_node,然后将其插入到队列尾部。最后,我们要更新tail节点的后向指针,将其指向新节点。

dequeue()函数中,我们首先判断队列是否为空。如果队列为空,则返回None。否则,我们将队列头部的第一个节点删除,并将head节点的后向指针指向下一个节点。

总结

使用双向链表来实现队列可以提高队列的效率。在Python中,我们可以使用内置的collections模块中的deque类来实现双向队列,也可以自定义一个双向链表来实现队列。