Као што сте већ проучавали важност структура података у претходном чланку, заронимо право у тему чланка, тј. Структура података у реду. Разговараћу о следећим темама:
- Потреба за структуром података о реду
- Примери свакодневног живота у реду
- Креирање структуре података о реду
- Ставите у ред
- Избаци ред
- Примене у реду
Потреба за структуром података о реду
Претпоставимо да једног дана желите филм. У мултиплексу су карте издаване по принципу „Прво дођи-први-послужи“ и људи су стајали једни иза других и чекали свој ред. Па шта ће ти?? Сигурно сте отишли позади и стали иза последње особе која је чекала карту.
Овде људи стоје један иза другог и опслужују се на основу Први у првом (ФИФО) механизам. Такав аранжман познат је под називом Ред чекања.
Примери свакодневног живота у реду
Размотримо неке примере где имамо редове који раде у свакодневном животу:
- Телефонска секретарица- Особа која прва назове ваш уређај прво буде присутна.
- Машина за проверу пртљага - Проверава пртљаг који је прво задржан на транспортној траци.
- Возила на мосту за наплату путарине - Возила која стижу рано полазе прва.
- Кол центар - телефонски системи ће користити редове чекања да људе који их зову држе у реду, све док представник услуге не буде слободан.
Сви ови примери следе Прво у последњем стратегија.
Креирање структуре података о реду
Поред допунских операција, могу рећи да су главне операције које су могуће у реду чекања:
један. Ставите у ред или додајте елемент на крај реда.
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:
Покушајмо да разумемо још један пример који користи структуру података реда. Можете ли да покушате да разумете код и кажете шта ради следећа функција?
- деф забава (н):
- акуеуе = Ред (100)
- за број у опсегу (1, н + 1):
- ред (број)
- резултат = 1
- вхиле (нот (акуеуе.ис_емпти ())):
- нум = АКУУЕ.ДЕКУЕУЕ ()
- резултат * = нум
- испис (резултат)
Када се функција фун () позове додавањем н,
- редови 2 до 4 стављају у ред елементе од 1 до н
- редови 5 до 8 проналазе производ тих елемената тако што га редом уклањају у ред
Овим смо дошли до краја овог чланка о структури података о реду. Ако сте сами успешно разумели и покренули кодове, више нисте новак у структури података реда.
Имате питање за нас? Молимо вас да га помињете у одељку за коментаре овог чланка и јавићемо вам се што је пре могуће.
Да бисте стекли детаљно знање о Питхону, заједно са разним апликацијама, можете се пријавити за уживо са 24/7 подршком и доживотним приступом.