Круговая очередь: эффективная структура данных для операций с очередью

В информатике циклическая очередь — это структура данных, представляющая собой набор элементов, упорядоченных по кругу. Он следует принципу FIFO (первым пришел — первым вышел), что означает, что элемент, который вставлен первым, будет первым удален. Циклические очереди имеют фиксированный размер и могут эффективно обрабатывать такие операции, как постановка в очередь (вставка) и удаление из очереди (удаление) за постоянное время.

В этой статье мы рассмотрим различные методы реализации циклической очереди, а также примеры кода на выбранном вами языке программирования.

Метод 1: реализация на основе массива
Один из самых простых способов реализации циклической очереди — использование массива. Вот пример на Python:

class CircularQueue:
    def __init__(self, k):
        self.k = k
        self.queue = [None] * k
        self.head = self.tail = -1
    def enqueue(self, item):
        if (self.tail + 1) % self.k == self.head:
            print("Queue is full.")
        elif self.head == -1:  # First element
            self.head = self.tail = 0
            self.queue[self.tail] = item
        else:
            self.tail = (self.tail + 1) % self.k
            self.queue[self.tail] = item
    def dequeue(self):
        if self.head == -1:
            print("Queue is empty.")
            return None
        elif self.head == self.tail:  # Last element
            item = self.queue[self.head]
            self.head = self.tail = -1
            return item
        else:
            item = self.queue[self.head]
            self.head = (self.head + 1) % self.k
            return item

Метод 2: реализация на основе связанного списка
Другой подход заключается в реализации циклической очереди с использованием связанного списка. Вот пример на Java:

class Node {
    int data;
    Node next;

    public Node(int data) {
        this.data = data;
        this.next = null;
    }
}
class CircularQueue {
    Node head, tail;
    int k;
    int size;

    public CircularQueue(int k) {
        this.k = k;
        this.size = 0;
    }

    public void enqueue(int item) {
        if (size == k) {
            System.out.println("Queue is full.");
            return;
        }

        Node newNode = new Node(item);

        if (head == null) {
            head = tail = newNode;
        } else {
            tail.next = newNode;
            tail = newNode;
        }

        tail.next = head;
        size++;
    }

    public int dequeue() {
        if (size == 0) {
            System.out.println("Queue is empty.");
            return -1;
        }

        int item = head.data;

        if (size == 1) {
            head = tail = null;
        } else {
            head = head.next;
            tail.next = head;
        }

        size--;
        return item;
    }
}

Круговые очереди — это мощная структура данных для эффективных операций с очередями. Независимо от того, решите ли вы реализовать их с использованием массива или связанного списка, циклический характер очереди обеспечивает постоянную сложность времени для операций постановки и удаления из очереди. Это делает циклические очереди подходящими для сценариев, в которых необходимо обрабатывать элементы в циклическом порядке. Понимая различные методы реализации циклической очереди, вы сможете использовать эту структуру данных для оптимизации своего кода.