📜  双端队列数据结构(1)

📅  最后修改于: 2023-12-03 14:50:32.563000             🧑  作者: Mango

双端队列数据结构

双端队列(deque,全名double-ended queue)是一种具有队列和栈的性质的数据结构,又称为双向队列。双端队列中的元素可以从两端添加,也可以从两端删除。双端队列的操作方式和数据存储方式与队列和栈类似,但功能更加丰富。

实现方式

双端队列的实现方式有多种,可以用数组、链表等数据结构实现。这里以使用数组实现的双端队列为例,介绍其相关操作。

基本操作

初始化操作

双端队列的初始化操作是创建一个空的双端队列。其中,使用两个整数变量front和rear表示双端队列前后两端的位置,初始值均为-1。

class Deque:
    def __init__(self):
        self.queue = []
        self.front = -1
        self.rear = -1

判空操作

双端队列的判空操作即为判断队列是否为空,即队列前后两端的位置是否相等。

def is_empty(self):
    if self.front == self.rear == -1:
        return True
    else:
        return False

判满操作

双端队列的判满操作用于判断队列是否已满。在使用数组实现的双端队列中,队列的大小是有限的,因此需要判断队列中元素的数量是否已达到队列最大容量。

def is_full(self):
    if self.rear == len(self.queue) - 1:
        return True
    else:
        return False

头部插入操作

双端队列的头部插入操作用于在队列的头部插入元素。在使用数组实现的双端队列中,需要将头指针向前移动一个位置,然后将元素插入到该位置。

def add_front(self, data):
    if self.is_full():
        return "Queue is full"
    else:
        if self.front == -1 and self.rear == -1:
            self.front = self.rear = 0
            self.queue[self.front] = data
        else:
            self.front -= 1
            self.queue[self.front] = data
        return "Element added to front"

尾部插入操作

双端队列的尾部插入操作用于在队列的尾部插入元素。在使用数组实现的双端队列中,需要将尾指针向后移动一个位置,然后将元素插入到该位置。

def add_rear(self, data):
    if self.is_full():
        return "Queue is full"
    else:
        if self.front == -1 and self.rear == -1:
            self.front = self.rear = 0
            self.queue[self.rear] = data
        else:
            self.rear += 1
            self.queue[self.rear] = data
        return "Element added to rear"

头部删除操作

双端队列的头部删除操作用于删除队列的头部元素。在使用数组实现的双端队列中,需要将头指针向后移动一个位置,然后将该位置的元素删除。

def remove_front(self):
    if self.is_empty():
        return "Queue is empty"
    else:
        if self.front == self.rear:
            self.front = self.rear = -1
        else:
            self.front += 1
        return "Element removed from front"

尾部删除操作

双端队列的尾部删除操作用于删除队列的尾部元素。在使用数组实现的双端队列中,需要将尾指针向前移动一个位置,然后将该位置的元素删除。

def remove_rear(self):
    if self.is_empty():
        return "Queue is empty"
    else:
        if self.front == self.rear:
            self.front = self.rear = -1
        else:
            self.rear -= 1
        return "Element removed from rear"

头部查看操作

双端队列的头部查看操作用于查看队列的头部元素。在使用数组实现的双端队列中,返回头指针指向的元素即可。

def peek_front(self):
    if self.is_empty():
        return "Queue is empty"
    else:
        return self.queue[self.front]

尾部查看操作

双端队列的尾部查看操作用于查看队列的尾部元素。在使用数组实现的双端队列中,返回尾指针指向的元素即可。

def peek_rear(self):
    if self.is_empty():
        return "Queue is empty"
    else:
        return self.queue[self.rear]
使用示例

下面是使用双端队列的示例代码:

queue = Deque()

print(queue.add_rear(1))    # Element added to rear
print(queue.add_rear(2))    # Element added to rear
print(queue.add_front(3))   # Element added to front
print(queue.is_empty())     # False
print(queue.is_full())      # False
print(queue.peek_front())   # 3
print(queue.peek_rear())    # 2
print(queue.remove_front()) # Element removed from front
print(queue.remove_rear())  # Element removed from rear