Структуры данных Очередь и Дек
В прошлом уроке вы познакомились со стеком, а этот посвящён очереди. В отличие от стека, который работает по принципу LIFO (Last In First Out), очередь основана на концепции FIFO (с англ. First In First Out — «первый вошёл, первый вышел»). То есть первым извлекают элемент, который добавили раньше всех. Сложность этой операции должна быть O(1).
На основе этой структуры данных реализованы многие сущности в программировании.
Если несколько процессов хотят получить доступ к одному ресурсу, в общем случае они встают в очередь. На работу с этим ресурсом операционная система выделяет каждому процессу по очереди небольшой квант времени. Это время настолько мало, что нам кажется, будто несколько программ работают параллельно. В один и тот же момент можно писать письмо, слушать музыку, скачивать файл из интернета. Но количество действительно одновременно работающих программ не превышает количество ядер в процессоре.
Другой пример.
Возможно, вы слышали об очередях сообщений — например, RabbitMQ или kafka. В их основе лежит концепция очередей. Этот пример концептуально похож на предыдущий. В очередь становятся объекты, которые хотят получить доступ к какому-то ресурсу.
С очередями в повседневной жизни сталкиваемся мы все.
Кассир в магазине может одновременно обслуживать только одного покупателя, поэтому приходится стоять в очереди.
Если мы звоним по горячей линии и все операторы заняты, тоже нужно ждать.
При моделировании подобных сценариев в программировании удобно применять структуру данных очередь.
Например, в стандартной библиотеке Python есть модуль queue (с англ. «очередь»), а в этом модуле — объект Queue, реализация очереди.
Аналогичный объект есть не во всех языках программирования. Но мы его рассмотрим, так как на этом примере можно разобраться, как работают очереди.
Скопировать кодPYTHON
from queue import Queue
queue = Queue()
queue.put('a')
queue.put('b')
Чтобы добавить элемент в очередь, применяют метод put(), а чтобы извлечь — метод get().
Извлечём элемент из очереди:
Скопировать кодPYTHON
elem = queue.get()