Python Черга: FIFO, LIFO Приклад

Що таке Python Черга?

Черга — це контейнер, у якому зберігаються дані. Дані, які вводяться першими, будуть видалені першими, тому чергу також називають «Першим прийшов, першим вийшов» (FIFO). Черга має два кінці: передній і задній. Предмети вводяться ззаду і виймаються з лицьового боку.

Як Python Робота в черзі?

Чергу можна легко порівняти з прикладом реального світу: черга людей, які чекають у черзі біля каси, людина, яка стоїть першою, отримає квиток першою, за нею наступна особа і так далі. Така ж логіка стосується і структури даних черги.

Ось схематичне зображення черги:

Python Робота в черзі

Команда Задній представляє точку, де елементи вставляються всередину черги. У цьому прикладі значенням є 7.

Команда передній представляє точку, де елементи з черги будуть видалені. Якщо ви видалите елемент із черги, перший елемент, який ви отримаєте, буде 1, як показано на малюнку.

Елемент 1 був першим, який було вставлено в чергу, а під час видалення він вийшов першим. Тому черга називається FIRST IN FIRST OUT (FIFO).

Python Робота в черзі

У черзі елементи видаляються за порядком і не можуть бути видалені між ними. Ви просто не можете випадковим чином видалити елемент 5 із черги, для цього вам доведеться видалити всі елементи до 5. Елементи в черзі буде видалено в тому порядку, в якому вони були вставлені.

Види черги в Python

В основному існує два типи черги Python:

  • Перший у черзі «Перший вийшов»: для цього елемент, який йде першим, буде першим виходити. Щоб працювати з FIFO, вам потрібно викликати Черга() клас із модуля черги.
  • Останній у черзі, першим вийшов: тут елемент, який введено останнім, буде першим, хто вийде. Щоб працювати з 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:

  • put(item): Це помістить елемент у чергу.
  • отримати(): Це поверне вам елемент із черги.
  • порожній(): Він поверне true, якщо черга порожня, і false, якщо елементи присутні.
  • qsize(): повертає розмір черги.
  • повний(): повертає 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. Тепер ми побачимо, як додати більше одного елемента, а також видалити його.

Додати елемент у чергу FIFO

import queue
q1 = queue.Queue()

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

Видалити елемент із черги FIFO

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

Додати елемент у чергу LIFO

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

Видалити елемент із черги LIFO

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

Reversing Queue

Щоб змінити чергу, ви можете скористатися іншою чергою та рекурсією.

У наступному прикладі показано, як повернути чергу.

приклад:

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 (First in First Out Queue) елемент, який йде першим, буде першим виходити.
  • Для LIFO (Last in First Out Queue) елемент, який введено останнім, буде першим, хто вийде.
  • Елемент у чергу додається за допомогою методу put(item).
  • Щоб видалити елемент, використовується метод get().