返回

双端队列,结构精妙,应用无限

后端

队列的妙用

在计算机科学中,队列是一种重要的数据结构,它按照先进先出(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]

总结

循环双端队列是一种灵活且强大的数据结构,它具有双端添加和删除元素的能力。它可以用于实现各种场景,例如模拟现实生活中的队列或处理数据流。通过使用数组或链表,我们可以轻松地实现循环双端队列。