Python Опашка: FIFO, LIFO Пример

⚡ Умно обобщение

Python Опашката е линейна структура от данни, която съхранява елементи и ги освобождава в определен ред. Модулът queue предоставя варианти на FIFO, LIFO и приоритети за безопасно управление на задачи, буфериране на данни и координиране на работата между нишките.

  • 🔢 FIFO: Класът Queue премахва първо най-стария елемент, което е идеално за планиране на задачи и буфериране.
  • 🔁 ЛИФО: Класът LifoQueue премахва първо най-новия елемент, като се държи като стек.
  • 📦 Основни методи: put(), get(), qsize(), empty() и full() управляват елементите и отчитат състоянието на опашката.
  • 🧵 Безопасно за нишки: Модулът за опашка обработва заключването, така че множество нишки могат безопасно да споделят една опашка.
  • 🎯 Приоритет: PriorityQueue освобождава елементи по приоритет, а не по ред на вмъкване.
  • 🤖 Помощ с изкуствен интелект: Асистентите с изкуствен интелект генерират код за опашки и обясняват компромисите между FIFO и LIFO от обикновена подкана.

Python Опашка FIFO LIFO

Какво е Python Опашка?

Опашката е контейнер, който съдържа данни. Данните, които са въведени първи, ще бъдат премахнати първи и следователно опашката се нарича още „Първи влезли първи“ (FIFO). Опашката има два края отпред и отзад. Артикулите се влизат отзад и се изваждат от предната страна.

Как действа Python Работа на опашка?

Опашката може лесно да се сравни с примера от реалния свят, опашката от хора, чакащи на опашка на гишето за билети, лицето, което стои първо, ще получи билета първо, последвано от следващия човек и т.н. Същата логика важи и за структурата на данните на опашката.

Ето схематично представяне на опашка:

Python Работа на опашка

- Заден представлява точката, в която елементите се вмъкват в опашката. В този пример 7 е стойност за това.

- преден представлява точката, където елементите от опашката ще бъдат премахнати. Ако премахнете елемент от опашката, първият елемент, който ще получите, е 1, както е показано на фигурата.

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

Python Работа на опашка

В опашката елементите се премахват по ред и не могат да се премахват между тях. Просто не можете да премахнете елемент 5 произволно от опашката, за да направите това, ще трябва да премахнете всички елементи преди 5. Елементите в опашката ще бъдат премахнати в реда, в който са вмъкнати.

Видове опашка в Python

Има основно два вида опашка Python:

  • First in First out Queue: За това елементът, който отива първи, ще бъде първият, който излиза. За да работите с FIFO, трябва да извикате опашка() клас от модула за опашка.
  • Last in First out 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:

  • постави (елемент): Това ще постави елемента в опашката.
  • получи(): Това ще ви върне елемент от опашката.
  • празен(): Ще върне 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

Премахване на елемент от 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

Премахване на елемент от опашката 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 опашка

За да обърнете опашката, можете да използвате друга опашка и рекурсия.

Следващият пример показва как да върнете опашката.

Пример:

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, където най-новият елемент тръгва пръв. PythonМодулът за опашка на 's предлага Queue за FIFO поведение и LifoQueue за стеково поведение.

Да. Queue, LifoQueue и PriorityQueue са създадени за многонишкови програми и обработват заключването вътрешно, така че много нишки производители и потребители могат да споделят една опашка без условия на състезание или повредени данни.

queue.Queue е безопасен за нишки и е проектиран за нишки от типа производител-потребител. collections.deque е по-бърза универсална двустранна опашка за еднонишков код, поддържаща бързо добавяне и изваждане от двата края.

PriorityQueue освобождава елементи по приоритет, вместо по ред на вмъкване. Поставяте кортежи (priority, data) и get() връща първо числото с най-нисък приоритет, което е подходящо за планировчици и алгоритми за най-кратък път.

По подразбиране get() блокира и изчаква, докато даден елемент стане наличен. Предайте block=False или използвайте get_nowait(), за да повишите изключението queue.Empty незабавно, вместо да чакате нов елемент.

Предайте maxsize на конструктора, например queue.Queue(5). Когато опашката е пълна, put() блокира, докато се освободи място и full() връща True. maxsize 0 означава неограничена опашка.

Асистентите с изкуствен интелект генерират код за опашки от типа „производител-потребител“, обясняват компромисите между FIFO и LIFO и предлагат дали queue.Queue, deque или asyncio.Queue е подходящ за вашия случай. Те също така помагат за откриване на безизходици и липсващи извиквания на task_done().

Да. GitHub Copilot автоматично довършва настройката на опашката, циклите put() и get() и работните нишки от коментар. Инструментите на Agentic AI отиват по-далеч, като рефакторират блокиращ код в asyncio.Queue и добавят обработка на грешки в целия файл.

Обобщете тази публикация с: