Шта је структура података о реду у Питхону?



Овај чланак ће вам пружити детаљно и свеобухватно знање о структури података редова у Питхону са пуно примера.

Као што сте већ проучавали важност структура података у претходном чланку, заронимо право у тему чланка, тј. Структура података у реду. Разговараћу о следећим темама:

Потреба за структуром података о реду

Претпоставимо да једног дана желите филм. У мултиплексу су карте издаване по принципу „Прво дођи-први-послужи“ и људи су стајали једни иза других и чекали свој ред. Па шта ће ти?? Сигурно сте отишли ​​позади и стали иза последње особе која је чекала карту.





queue-data-structure

Овде људи стоје један иза другог и опслужују се на основу Први у првом (ФИФО) механизам. Такав аранжман познат је под називом Ред чекања.



Примери свакодневног живота у реду

Размотримо неке примере где имамо редове који раде у свакодневном животу:

  • Телефонска секретарица- Особа која прва назове ваш уређај прво буде присутна.
  • Машина за проверу пртљага - Проверава пртљаг који је прво задржан на транспортној траци.
  • Возила на мосту за наплату путарине - Возила која стижу рано полазе прва.
  • Кол центар - телефонски системи ће користити редове чекања да људе који их зову држе у реду, све док представник услуге не буде слободан.

Сви ови примери следе Прво у последњем стратегија.

Креирање структуре података о реду

Поред допунских операција, могу рећи да су главне операције које су могуће у реду чекања:



један. Ставите у ред или додајте елемент на крај реда.

2. Избаци ред или уклоните елемент са чела реда

Сада, кренимо са стварањем реда класа у Питхону:

цласс Куеуе: деф __инит __ (селф, мак_сизе): селф .__ мак_сизе = мак_сизе селф .__ елементс = [Ноне] * селф .__ мак_сизе селф .__ задњи = -1 селф .__ фронт = 0
  • мак_сизе је максималан број елемената који се очекује у реду.
  • Елементи реда се чувају на питхон листи
  • задња означава положај индекса последњег елемента у реду.
  • У почетку се узима задњи део -1 јер је ред празан
  • Фронт означава положај првог елемента у реду.
  • За почетак се узима да је 0, јер ће увек показивати на први елемент реда

Енкуеуе

Сада, када покушавате да ставите елементе у Ред чекања, морате да запамтите следеће тачке:

  • Без обзира да ли је остало простора у реду или не, тј. Ако је задњи једнак мак_сизе -1
  • Задњи део ће показати на последњи елемент убачен у ред.

Па, који ће бити алгоритам ??

#ретурнс мак_сизе оф куеуе деф гет_мак_сизе (селф): ретурн селф .__ мак_сизе # враћа боол вредност да ли је ред пун или не, Труе ако је попуњен и Фалсе иначе деф ис_фулл (селф): ретурн селф .__ задњи == селф .__ мак_сизе-1 # убацује / ставља податке у ред чекања ако није пун деф енкуе (селф, дата): иф (селф.ис_фулл ()): принт ('Ред је пун. Није могућ ниједан ред') елсе: селф .__ задњи + = 1 селф. __елементи [селф .__ задњи] = подаци #приказати сав садржај приказа деф куеуе (селф): за и у опсегу (0, селф .__ задњи + 1): испис (селф .__ елементи [и]) # Можете користити испод __стр __ () за испис елемената ДС објекта током отклањања грешака деф __стр __ (селф): мсг = [] индек = селф .__ фронт вхиле (индек<=self.__rear): msg.append((str)(self.__elements[index])) index+=1 msg=' '.join(msg) msg='Queue data(Front to Rear): '+msg return msg

Сада, када извршите следеће:

куеуе1 = Ред (5)

# Уврстите све потребне елементе у ред.

куеуе1.енкуеуе („А“)

куеуе1.енкуеуе („Б“)

куеуе1.енкуеуе („Ц“)

куеуе1.енкуеуе („Д“)

куеуе1.енкуеуе („Е“)

куеуе1.дисплаи ()

куеуе1.енкуеуе („Ф“)

испис (ред 1)

Излаз:

ДО

Б.

Ц.

Д.

ИС

Ред је пун. Ниједан ред није могућ

Подаци о реду (од напред до позади): А Б Ц Д Е

Де-Куеуе

Сада, пошто сте уметнули / ставили елементе у ред у реду, желите да их уклоните из редова / избришете са предње стране, па треба да водите рачуна о следећем:

  • Постоје елементи у реду, тј. Задњи део не сме бити једнак -1.
  • Друго, морате имати на уму да како се елементи бришу с предње стране, тако и након брисања предњи треба повећати на тачку на следећи предњи.
  • Предња страна не би требало да показује крај реда, тј. Једнака је мак_сизе.

Па, који ће бити алгоритам ??

#функција за проверу да ли је ред празан или није деф ис_емпти (селф): иф (селф .__ задњи == - 1 или селф .__ фронт == селф .__ мак_сизе): ретурн Труе елсе: ретурн Фалсе # фунцтион да декуе елемент и ретурн деф дефуеуе (селф): иф (селф.ис_емпти ()): принт ('ред је већ празан') елсе: дата = селф .__ елементс [селф .__ фронт] селф .__ фронт + = 1 ретурн дата # фунцтион то дисплаи елементс фром сприједа према назад ако ред није празан деф дисплаи (селф): иф (нот селф.ис_емпти ()): фор и ин ранге (селф .__ фронт, селф .__ задњи + 1): принт (селф .__ елементс [и]) елсе : принт ('празан ред')

Сада када извршите следеће:

куеуе1 = Ред (5)

# Избаци све потребне елементе у ред

куеуе1.енкуеуе („А“)

куеуе1.енкуеуе („Б“)

куеуе1.енкуеуе („Ц“)

куеуе1.енкуеуе („Д“)

куеуе1.енкуеуе („Е“)

испис (ред 1)

# Избаци све потребне елементе у ред

принт („Декуеуед:“, куеуе1.декуеуе ())

принт („Декуеуед:“, куеуе1.декуеуе ())

принт („Декуеуед:“, куеуе1.декуеуе ())

принт („Декуеуед:“, куеуе1.декуеуе ())

принт („Декуеуед:“, куеуе1.декуеуе ())

принт („Декуеуед:“, куеуе1.декуеуе ())

# Прикажите све елементе у реду.

куеуе1.дисплаи ()

Излаз:

Подаци о реду (од напред до позади): А Б Ц Д Е

Декуеуед: А.

Декуеуед: Б.

Декуеуед: Ц.

Декуеуед: Д.

Декуеуед: Е.

ред је већ празан

Декуеуед: Нема

празан ред

Примене у реду

Од сада сте већ разумели основе реда. Сада ћемо дубље заронити у неке од његових примена.

  • Пример 1:

Ред за штампање у оперативном систему Виндовс користи ред за чување свих активних задатака за штампу и на чекању. Када желимо да штампамо документе, издајемо наредбе за штампање једну за другом. На основу наредби за штампање, документи ће се поредати у ред за штампање. Када је штампач спреман, документ ће се послати први према првом како би се одштампао.

Претпоставимо да сте издали наредбе за штампање за 3 документа по редоследу доц1, а затим доц2 и доц3.
Ред за штампу ће бити попуњен као што је приказано доле:

доц-н, где је документ документ послат на штампу и н, је број страница у документу. На пример, доц2-10 значи да се доц2 штампа и има 10 страница. Ево кода који симулира рад реда чекања за штампање. Прођите кроз код и посматрајте како се ред користи у овој имплементацији.

цласс Куеуе: деф __инит __ (селф, мак_сизе): селф .__ мак_сизе = мак_сизе селф .__ елементс = [Ноне] * селф .__ мак_сизе селф .__ задњи = -1 селф .__ фронт = 0 деф ис_фулл (селф): иф (селф .__ задњи = = селф .__ мак_сизе-1): ретурн Труе ретурн Фалсе деф ис_емпти (селф): иф (селф .__ фронт> селф .__ бацк): ретурн Труе ретурн Фалсе деф енкуеуе (селф, дата): иф (селф.ис_фулл ()): принт ('Ред је пун !!!') елсе: селф .__ задњи + = 1 селф .__ елементи [селф .__ задњи] = дата деф декуеуе (селф): иф (селф.ис_емпти ()): принт ('Ред је празан! !! ') елсе: дата = селф .__ елементс [селф .__ фронт] селф .__ фронт + = 1 ретурн дата деф дисплаи (селф): за индекс у домету (селф .__ фронт, селф .__ задњи + 1): принт (селф .__ елементс [индек]) деф гет_мак_сизе (селф): ретурн селф .__ мак_сизе # Можете да користите доле наведени __стр __ () за испис елемената ДС објекта док #дебуг деф __стр __ (селф): мсг = [] индек = селф .__ фронт вхиле (индекс<=self.__rear): msg.append((str)(self.__elements[index])) index+=1 msg=' '.join(msg) msg='Queue data(Front to Rear): '+msg return msg #function that enqueue are the documents to be printed in Queue named print_queue def send_for_print(doc): global print_queue if(print_queue.is_full()): print('Queue is full') else: print_queue.enqueue(doc) print(doc,'sent for printing') #function that prints the document if number of pages of document is less than #total number of pages in printer def start_printing(): global print_queue while(not print_queue.is_empty()): #here we dequeue the Queue and take the coument that was input first for printing. doc=print_queue.dequeue() global pages_in_printer #the aim of this for loop is to find number of pages of the of document which is doc name followed by “-“ for i in range(0,len(doc)): if(doc[i]=='-'): no_of_pages=int(doc[i+1:]) break if(no_of_pages<=pages_in_printer): print(doc,'printed') pages_in_printer-=no_of_pages print('Remaining no. of pages in printer:', pages_in_printer) else: print('Couldn't print',doc[:i],'. Not enough pages in the printer.') pages_in_printer=12 print_queue=Queue(10) send_for_print('doc1-5') send_for_print('doc2-3') send_for_print('doc3-6') start_printing()

Излаз:

доц1-5 послат на штампу

доц2-3 послат на штампу

доц3-6 послат на штампу

доц1-5 штампано

шта је овај оператер у јави

Преостали бр. страница у штампачу: 7

доц2-3 штампано

Преостали бр. страница у штампачу: 4

Штампање доц3 није успело. Нема довољно страница у штампачу

  • Пример 2:

Покушајмо да разумемо још један пример који користи структуру података реда. Можете ли да покушате да разумете код и кажете шта ради следећа функција?

  1. деф забава (н):
  2. акуеуе = Ред (100)
  3. за број у опсегу (1, н + 1):
  4. ред (број)
  5. резултат = 1
  6. вхиле (нот (акуеуе.ис_емпти ())):
  7. нум = АКУУЕ.ДЕКУЕУЕ ()
  8. резултат * = нум
  9. испис (резултат)

Када се функција фун () позове додавањем н,

  • редови 2 до 4 стављају у ред елементе од 1 до н
  • редови 5 до 8 проналазе производ тих елемената тако што га редом уклањају у ред

Овим смо дошли до краја овог чланка о структури података о реду. Ако сте сами успешно разумели и покренули кодове, више нисте новак у структури података реда.

Имате питање за нас? Молимо вас да га помињете у одељку за коментаре овог чланка и јавићемо вам се што је пре могуће.

Да бисте стекли детаљно знање о Питхону, заједно са разним апликацијама, можете се пријавити за уживо са 24/7 подршком и доживотним приступом.