Учебники

38) Python Queue

Что такое Python Queue?

Очередь — это контейнер, содержащий данные. Данные, которые вводятся первыми, будут удалены первыми, и, следовательно, очередь также называется «первым вошел первым» (FIFO). Очередь имеет два конца спереди и сзади. Элементы вводятся сзади и удаляются с лицевой стороны.

В этом уроке по Python вы узнаете:

Как работает Python Queue?

Очередь можно легко сравнить с реальным примером: очередь людей, ожидающих в очереди у кассы, человек, стоящий первым, получит билет первым, затем следующий человек и так далее. Та же логика применима и к структуре данных очереди.

Вот схематическое представление очереди:

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

Фронт представляет собой точку , в которой будут удалены элементы из очереди. Если вы удалите элемент из очереди, первый элемент, который вы получите, будет 1, как показано на рисунке.

Элемент 1 был первым, который был вставлен в очередь, и при удалении он вышел первым. Следовательно, очередь называется FIRST IN FIRST OUT (FIFO).

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

Типы очереди в Python

В основном в Python есть два типа очереди:

  • First in First out Queue: для этого первым появится элемент, который идет первым.

    Для работы с FIFO необходимо вызвать класс Queue () из модуля очереди.

  • Последняя очередь — первая очередь: здесь первым появится элемент, который введен последним.

    Для работы с LIFO необходимо вызвать класс LifoQueue () из модуля очереди.

Установка очереди Python

Работать с очередью в python очень просто. Вот шаги, чтобы следовать, чтобы использовать очередь в вашем коде.

Шаг 1) Вам просто нужно импортировать модуль очереди, как показано ниже:

import queue

Модуль доступен по умолчанию с python, и вам не требуется дополнительная установка, чтобы начать работу с очередью. Существует 2 типа очереди FIFO (первый пришел первым вышел) и LIFO (последний пришел первым вышел).

Шаг 2) Для работы с очередью FIFO вызовите класс Queue, используя импортированный модуль очереди, как показано ниже:

import queue
q1 = queue.Queue()

Шаг 3) Для работы с очередью LIFO вызовите класс LifoQueue (), как показано ниже:

import queue
q1 = queue.LifoQueue()

Методы, доступные внутри класса Queue и LifoQueue

Ниже приведены важные методы, доступные в классах Queue и LifoQueue:

  • положить (элемент): это поместит элемент в очередь.
  • get (): это вернет вам элемент из очереди.
  • empty (): он вернет true, если очередь пуста, и false, если элементы присутствуют.
  • qsize (): возвращает размер очереди.
  • full (): возвращает true, если очередь заполнена, иначе false.

Пример первого в очереди

В случае «первым пришел — первым вышел» первым вышел первый элемент.

Добавить и поместить в очередь

Давайте поработаем над примером добавления элемента в очередь. Чтобы начать работу с очередью, сначала импортируйте очередь модуля, как показано в примере ниже.

Чтобы добавить элемент, вы можете использовать метод put (), как показано в примере:

import queue
q1 = queue.Queue()
q1.put(10) #this will additem 10 to the queue.

По умолчанию размер очереди бесконечен, и вы можете добавить в нее любое количество элементов. Если вы хотите определить размер очереди, то же самое можно сделать следующим образом

import queue
q1 = queue.Queue(5) #The max size is 5.
q1.put(1)
q1.put(2)
q1.put(3)
q1.put(4)
q1.put(5)
print(q1.full()) # will return true.

Вывод:

True

Теперь размер очереди равен 5, и он не займет более 5 элементов, а метод q1.full () вернет true. Добавление дополнительных элементов не приведет к дальнейшему выполнению кода.

Удалить элемент из очереди

Чтобы удалить элемент из очереди, вы можете использовать метод get (). Этот метод позволяет элементы из очереди при вызове.

В следующем примере показано, как удалить элемент из очереди.

import queue
q1 = queue.Queue()
q1.put(10)

item1 = q1.get()

print('The item removed from the queue is ', item1)

Вывод:

The item removed from the queue is  10

Пример очереди в очереди

В случае с последним в очереди «первый вышел» первым будет выдан элемент, который введен последним.

Для работы с LIFO, т. Е. Последним в первой очереди, нам нужно импортировать модуль очереди и использовать метод LifoQueue ().

Добавить и поместить в очередь

Здесь мы поймем, как добавить элемент в очередь LIFO.

import queue
q1 = queue.LifoQueue()
q1.put(10)

Вы должны использовать метод put () в LifoQueue, как показано в примере выше.

Удалить элемент из очереди

Чтобы удалить элемент из LIFOqueue, вы можете использовать метод get ().

import queue
q1 = queue.LifoQueue()
q1.put(10)

item1 = q1.get()

print('The item removed from the LIFO queue is ', item1)

Вывод:

The item removed from the LIFO queue is  10

Добавить более 1 элемента в очередь

В приведенных выше примерах мы видели, как добавить один элемент и удалить элемент для FIFO и LIFOqueue. Теперь мы увидим, как добавить более одного элемента, а также удалить его.

Добавить и элемент в FIFOqueue

import queue
q1 = queue.Queue()

for i in range(20):
    q1.put(i) # this will additem from 0 to 20 to the queue

Удалить элемент из FIFOqueue

import queue
q1 = queue.Queue()

for i in range(20):
    q1.put(i) # this will additem from 0 to 20 to the queue

while not q1.empty():
print("The value is ", q1.get()) # get() will remove the item from the queue.

Вывод:

The value is  0
The value is  1
The value is  2
The value is  3
The value is  4
The value is  5
The value is  6
The value is  7
The value is  8
The value is  9
The value is  10
The value is  11
The value is  12
The value is  13
The value is  14
The value is  15
The value is  16
The value is  17
The value is  18
The value is  19

Добавить и пункт в LIFOqueue

import queue
q1 = queue.LifoQueue()
for i in range(20):
    q1.put(i) # this will additem from 0 to 20 to the queue

Удалить элемент из LIFOqueue

import queue
q1 = queue.LifoQueue()

for i in range(20):
    q1.put(i) # this will additem from 0 to 20 to the queue


while not q1.empty():
print("The value is ", q1.get()) # get() will remove the item from the queue. 

Вывод:

The value is  19
The value is  18
The value is  17
The value is  16
The value is  15
The value is  14
The value is  13
The value is  12
The value is  11
The value is  10
The value is  9
The value is  8
The value is  7
The value is  6
The value is  5
The value is  4
The value is  3
The value is  2
The value is  1
The value is  0 

Сортировка очереди

В следующем примере показана сортировка очереди. Алгоритм, используемый для сортировки, представляет собой пузырьковую сортировку.

import queue
q1 = queue.Queue()
#Addingitems to the queue
q1.put(11)
q1.put(5)
q1.put(4)
q1.put(21)
q1.put(3)
q1.put(10)

#using bubble sort on the queue
n =  q1.qsize()
for i in range(n):
    x = q1.get() # the element is removed
    for j in range(n-1):
        y = q1.get() # the element is removed
        if x > y :  
            q1.put(y)   #the smaller one is put at the start of the queue
        else:
            q1.put(x)  # the smaller one is put at the start of the queue
            x = y     # the greater one is replaced with x and compared again with nextelement
    q1.put(x)

while (q1.empty() == False): 
print(q1.queue[0], end = " ")  
        q1.get()

Вывод:

3 4 5 10 11 21

Реверсивная очередь

Чтобы изменить очередь, вы можете использовать другую очередь и рекурсию.

В следующем примере показано, как перевернуть очередь.

Пример:

import queue
q1 = queue.Queue()

q1.put(11)
q1.put(5)
q1.put(4)
q1.put(21)
q1.put(3)
q1.put(10)

def reverseQueue (q1src, q2dest) :  
    buffer = q1src.get()
    if (q1src.empty() == False) :
reverseQueue(q1src, q2dest)      #using recursion
    q2dest.put(buffer)
return q2dest

q2dest = queue.Queue()
qReversed = reverseQueue(q1,q2dest)

while (qReversed.empty() == False): 
print(qReversed.queue[0], end = " ")  
        qReversed.get()

Вывод:

10 3 21 4 5 11

Резюме:

  • Очередь — это контейнер, содержащий данные. Существует два типа очереди: FIFO и LIFO.
  • Для FIFO (очередь «первым пришел — первым вышел») первым вышел элемент, который идет первым.
  • Для LIFO (очередь первым пришел первым) элемент, который введен последним, будет первым, кто выйдет.
  • Элемент в очереди добавляется с помощью метода put (item).
  • Для удаления элемента используется метод get ().