返回
双端队列,结构精妙,应用无限
后端
2023-11-07 09:08:31
队列的妙用
在计算机科学中,队列是一种重要的数据结构,它按照先进先出(FIFO)的原则组织元素。简单地说,这意味着第一个进入队列的元素也是第一个离开队列的元素。队列通常用于各种场景,例如模拟现实生活中的队列或处理数据流。
双端队列的优势
双端队列是队列的一种变体,它允许您在队列的两端添加或删除元素。这使得双端队列比传统队列更加灵活,因为它可以同时用作队列和栈。双端队列通常用于实现浏览器历史记录、撤销/重做操作或任何需要快速访问数据两端的场景。
循环双端队列的实现
循环双端队列可以使用数组或链表来实现。在本例中,我们将使用数组来实现循环双端队列。在循环双端队列中,我们使用两个指针来跟踪队列的头部和尾部。当队列为空时,头部和尾部指针都指向同一个位置。当队列中有元素时,头部指针指向队列的头部,尾部指针指向队列的尾部。
代码实现
class CircularDeque:
def __init__(self, capacity):
self.capacity = capacity
self.arr = [None] * capacity
self.head = -1
self.tail = -1
def is_empty(self):
return self.head == -1
def is_full(self):
return (self.tail + 1) % self.capacity == self.head
def enqueue_front(self, value):
if self.is_full():
raise IndexError("Queue is full")
if self.head == -1:
self.head = self.tail = 0
else:
self.head = (self.head - 1) % self.capacity
self.arr[self.head] = value
def enqueue_rear(self, value):
if self.is_full():
raise IndexError("Queue is full")
if self.head == -1:
self.head = self.tail = 0
else:
self.tail = (self.tail + 1) % self.capacity
self.arr[self.tail] = value
def dequeue_front(self):
if self.is_empty():
raise IndexError("Queue is empty")
value = self.arr[self.head]
if self.head == self.tail:
self.head = self.tail = -1
else:
self.head = (self.head + 1) % self.capacity
return value
def dequeue_rear(self):
if self.is_empty():
raise IndexError("Queue is empty")
value = self.arr[self.tail]
if self.head == self.tail:
self.head = self.tail = -1
else:
self.tail = (self.tail - 1) % self.capacity
return value
def __str__(self):
if self.head == -1:
return "Queue is empty"
output = "["
current = self.head
while current != self.tail:
output += str(self.arr[current]) + ", "
current = (current + 1) % self.capacity
output += str(self.arr[self.tail]) + "]"
return output
# Example usage
queue = CircularDeque(5)
queue.enqueue_front(1)
queue.enqueue_rear(2)
queue.enqueue_front(3)
queue.enqueue_rear(4)
queue.enqueue_front(5)
print(queue)
# Output: [5, 3, 1, 2, 4]
queue.dequeue_front()
queue.dequeue_rear()
print(queue)
# Output: [3, 1, 2]
总结
循环双端队列是一种灵活且强大的数据结构,它具有双端添加和删除元素的能力。它可以用于实现各种场景,例如模拟现实生活中的队列或处理数据流。通过使用数组或链表,我们可以轻松地实现循环双端队列。