Очередь представляет собой абстрактный тип данных и линейную структуру, работающую по принципу "первым вошел, первым вышел" (First In - First Out, FIFO). Аналогия - очередь в магазине: новые покупатели встают в конец, а обслуживаются первым пришедшим.
Сложность выполнения: Аналогично связным спискам и стекам.
Пример кода:
Создаем очередь при помощи связных списков.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedListQueue:
def __init__(self):
self.front = None # начало очереди
self.rear = None # конец очереди
self._size = 0
def enqueue(self, item):
"""Добавление в конец очереди"""
new_node = Node(item)
if self.rear is None:
self.front = self.rear = new_node
else:
self.rear.next = new_node
self.rear = new_node
self._size += 1
def dequeue(self):
"""Удаление из начала очереди"""
if self.is_empty():
raise IndexError('Удаление из пустой очереди')
temp = self.front
self.front = temp.next
if self.front is None:
self.rear = None
self._size -= 1
return temp.data
def peek(self):
"""Просмотр первого элемента"""
if self.is_empty():
raise IndexError('Очередь пуста')
return self.front.data
def is_empty(self):
"""Проверка на пустоту"""
return self.front is None
def size(self):
"""Размер очереди"""
return self._size
Создаем очередь при помощи двух стеков
class TwoStacksQueue:
def __init__(self):
self.in_stack = [] # для добавления элементов
self.out_stack = [] # для удаления элементов
def enqueue(self, item):
"""Добавление элемента"""
self.in_stack.append(item)
def dequeue(self):
"""Удаление элемента"""
if self.is_empty():
raise IndexError('Удаление из пустой очереди')
if not self.out_stack:
while self.in_stack:
self.out_stack.append(self.in_stack.pop())
return self.out_stack.pop()
def peek(self):
"""Просмотр первого элемента"""
if self.is_empty():
raise IndexError('Очередь пуста')
if not self.out_stack:
while self.in_stack:
self.out_stack.append(self.in_stack.pop())
return self.out_stack[-1]
def is_empty(self):
"""Проверка на пустоту"""
return not (self.in_stack or self.out_stack)
def size(self):
"""Размер очереди"""
return len(self.in_stack) + len(self.out_stack)