Очередь — это абстрактная структура данных, работающая по принципу “первый пришёл — первый вышел” (FIFO, First In, First Out). Это означает, что первый добавленный элемент будет первым, который будет удалён.
Принцип FIFO:
Ограниченный доступ:
Динамическое изменение размера:
queue.append(element)
append
, который добавляет элемент в конец списка.front_element = queue.pop(0)
pop(0)
удаляет элемент по индексу 0 (первый элемент). Если очередь пуста, следует обработать это условие.front_element = queue[0]
is_empty = len(queue) == 0
size = len(queue)
len()
для получения количества элементов в очереди.Очередь можно реализовать несколькими способами:
class Queue:
def __init__(self):
self.queue = []
Queue
, который представляет собой очередь. В конструкторе __init__
инициализируем пустой список self.queue
, который будет использоваться для хранения элементов очереди.def enqueue(self, item):
self.queue.append(item)
enqueue
добавляет элемент item
в конец очереди. Мы используем метод append
списка, который добавляет элемент в конец.def dequeue(self):
return self.queue.pop(0) if not self.is_empty() else None
dequeue
удаляет и возвращает передний элемент очереди. Мы используем метод pop(0)
, который удаляет элемент по индексу 0 (первый элемент). Если очередь пуста (проверка через is_empty
), метод возвращает None
.def is_empty(self):
return len(self.queue) == 0
is_empty
проверяет, пуста ли очередь. Он возвращает True
, если длина списка self.queue
равна 0, и False
в противном случае.class Node:
def __init__(self, data):
self.data = data
self.next = None
Node
представляет собой узел связного списка. Каждый узел содержит данные (data
) и ссылку на следующий узел (next
). Изначально ссылка next
устанавливается в None
, так как новый узел ещё не связан с другими.class Queue:
def __init__(self):
self.front = None
self.rear = None
Queue
мы инициализируем два указателя: front
(указатель на передний элемент очереди) и rear
(указатель на задний элемент очереди). Оба указателя изначально равны None
, так как очередь пуста.def enqueue(self, item):
new_node = Node(item)
if self.rear is None:
self.front = self.rear = new_node
return
self.rear.next = new_node
self.rear = new_node
enqueue
добавляет новый элемент в очередь. Мы создаём новый узел new_node
, содержащий элемент item
.rear
равен None
, это значит, что очередь пуста, и мы устанавливаем как front
, так и rear
на новый узел.next
последнего узла (rear
) на новый узел и затем обновляем rear
на новый узел.def dequeue(self):
if self.front is None:
return None
dequeued_item = self.front.data
self.front = self.front.next
if self.front is None:
self.rear = None
return dequeued_item
dequeue
удаляет и возвращает передний элемент очереди.front
равен None
, очередь пуста, и мы возвращаем None
.dequeued_item
, затем перемещаем указатель front
на следующий узел.front
становится None
, это значит, что очередь опустела, и мы также устанавливаем rear
в None
.Управление задачами:
Сетевые пакеты:
Печать документов:
Обработка событий:
Очередь является важной структурой данных, которая находит широкое применение в программировании и алгоритмах. Понимание принципов работы с очередью позволяет эффективно решать множество задач и оптимизировать алгоритмы.