📅  最后修改于: 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