Jak jste již v předchozím článku studovali o důležitosti datových struktur, pojďme se ponořit přímo do tématu článku, tj. Datové struktury fronty. Budu diskutovat o následujících tématech:
- Potřeba datové struktury fronty
- Příklady každodenního života ve frontě
- Vytvoření datové struktury fronty
- Zařadit do fronty
- Zrušit frontu
- Aplikace fronty
Potřeba datové struktury fronty
Předpokládejme, že jednoho dne chcete film. V multiplexu byly vstupenky vydávány na principu „první přijít - první sloužit“ a lidé stáli za sebou a čekali, až na ně přijde řada. Tak co budeš dělat?? Určitě jste šli dozadu a postavili se za poslední osobu čekající na lístek.
Tady lidé stojí jeden za druhým a jsou obsluhováni na základě První-první-první-ven (FIFO) mechanismus. Takové uspořádání je známé jako Fronta.
Příklady každodenního života ve frontě
Podívejme se na několik příkladů, kdy používáme typ fronty pracující v každodenním životě:
- Telefonní záznamník - Osoba, která na vašem gadgetu zavolá jako první, se nejprve zúčastní.
- Stroj na kontrolu zavazadel - Zkontroluje zavazadla, která byla na dopravním pásu ponechána jako první.
- Vozidla na mostě pro výběr mýtného - Vozidla přijíždějící brzy odjíždějí první.
- Call centrum - telefonní systémy budou používat fronty, aby udržovaly lidi, kteří jim volají, v pořádku, dokud servisní zástupce nebude volný.
Všechny tyto příklady následují První-poslední-poslední strategie.
Vytvoření datové struktury fronty
Kromě doplňkových operací mohu říci, že hlavní možné operace ve frontě jsou:
jeden. Zařadit do fronty nebo přidat prvek na konec fronty.
2. Zrušit frontu nebo odeberte prvek z přední části fronty
Začněme vytvořením fronty tříd v Pythonu:
fronta třídy: def __init __ (self, max_size): self .__ max_size = max_size self .__ elements = [None] * self .__ max_size self .__ rear = -1 self .__ front = 0
- max_size je maximální počet prvků očekávaných ve frontě.
- Prvky fronty jsou uloženy v seznamu pythonů
- zadní označuje pozici indexu posledního prvku ve frontě.
- Zadní část je zpočátku považována za -1, protože fronta je prázdná
- Přední označuje polohu prvního prvku ve frontě.
- Přední strana je zpočátku považována za 0, protože bude vždy směřovat k prvnímu prvku fronty
Zařadit do fronty
Nyní, když se pokoušíte zařadit prvky do fronty, musíte si zapamatovat následující body:
- Zda ve frontě zbývá místo, nebo ne, tj. Pokud se zadní rovná max_size -1
- Zadní část bude ukazovat na poslední prvek vložený do fronty.
Jaký bude tedy algoritmus ??
#returns max_size of queue def get_max_size (self): return self .__ max_size #returns bool value whether queue is full or not, True if full and False otherwise def is_full (self): return self .__ rear == self .__ max_size-1 # vloží / zařadí data do fronty, pokud není plná def enqueue (self, data): if (self.is_full ()): print ('Queue is full. No enqueue possible') else: self .__ rear + = 1 self. __elements [self .__ rear] = data #display all the content of the queue def display (self): for i in range (0, self .__ rear + 1): print (self .__ elements [i]) #You can use the níže __str __ () pro tisk prvků objektu DS při ladění def __str __ (self): msg = [] index = self .__ front while (index<=self.__rear): msg.append((str)(self.__elements[index])) index+=1 msg=' '.join(msg) msg='Queue data(Front to Rear): '+msg return msg
Nyní, když provedete následující:
queue1 = Fronta (5)
# Zařaďte všechny požadované prvky do fronty.
queue1.enqueue („A“)
queue1.enqueue („B“)
queue1.enqueue („C“)
queue1.enqueue („D“)
queue1.enqueue („E“)
queue1.display ()
queue1.enqueue („F“)
tisk (fronta1)
Výstup:
NA
B
C
D
JE
Fronta je plná. Žádné pořadí není možné
Data fronty (zepředu dozadu): A B C D E
Zrušit frontu
Nyní, když jste vložili / zařadili prvky do fronty, chcete je vyřadit / smazat zepředu, takže se musíte postarat o následující:
- Ve frontě jsou prvky, tj. Zadní část by se neměla rovnat -1.
- Zadruhé si musíte pamatovat, že když jsou prvky smazány zepředu, tak po smazání by měl být front zvýšen tak, aby ukazoval na další front.
- Přední strana by neměla směřovat na konec fronty, tj. Rovna max_size.
Jaký bude tedy algoritmus ??
#function to check if queue is empty or not def is_empty (self): if (self .__ rear == - 1 or self .__ front == self .__ max_size): return True else: return False #function to deque an element and return to def dequeue (self): if (self.is_empty ()): print ('queue is already empty') else: data = self .__ elements [self .__ front] self .__ front + = 1 return data #function to display elements from zepředu dozadu, pokud fronta není prázdná def display (self): if (not self.is_empty ()): for i in range (self .__ front, self .__ rear + 1): print (self .__ elements [i]) else : print ('prázdná fronta')
Nyní, když provedete následující:
queue1 = Fronta (5)
ansible vs loutka vs kuchař
# Zařadit všechny požadované prvky
queue1.enqueue („A“)
queue1.enqueue („B“)
queue1.enqueue („C“)
queue1.enqueue („D“)
queue1.enqueue („E“)
tisk (fronta1)
# Zrušit pořadí všech požadovaných prvků
print („Dequeued:“, queue1.dequeue ())
print („Dequeued:“, queue1.dequeue ())
print („Dequeued:“, queue1.dequeue ())
print („Dequeued:“, queue1.dequeue ())
print („Dequeued:“, queue1.dequeue ())
print („Dequeued:“, queue1.dequeue ())
# Zobrazte všechny prvky ve frontě.
queue1.display ()
Výstup:
Data fronty (zepředu dozadu): A B C D E
Dequeued: A
Dequeued: B
Vyřazeno: C
Dequeued: D
Dequeued: E
fronta je již prázdná
Dequeued: None
prázdná fronta
Aplikace fronty
Od této chvíle jste již pochopili základy fronty. Nyní, abychom se ponořili hlouběji, se podíváme na některé z jeho aplikací.
java rozdíl mezi implementuje a rozšiřuje
- Příklad 1:
Tisková fronta v systému Windows používá frontu k uložení všech aktivních a čekajících tiskových úloh. Když chceme tisknout dokumenty, vydáváme tiskové příkazy jeden po druhém. Na základě tiskových příkazů se dokumenty seřadí v tiskové frontě. Když je tiskárna připravena, dokument bude odeslán jako první, první ven, aby byl vytištěn.
Předpokládejme, že jste vydali tiskové příkazy pro 3 dokumenty v pořadí doc1, následované doc2 a doc3.
Tisková fronta se naplní, jak je uvedeno níže:
doc-n, kde doc je dokument odeslaný k tisku an, je počet stránek v dokumentu. Například doc2-10 znamená, že má být vytištěn doc2 a má 10 stránek. Zde je kód, který simuluje operaci tiskové fronty. Projděte si kód a sledujte, jak se fronta používá v této implementaci.
Fronta třídy: def __init __ (self, max_size): self .__ max_size = max_size self .__ elements = [None] * self .__ max_size self .__ rear = -1 self .__ front = 0 def is_full (self): if (self .__ rear = = self .__ max_size-1): return True return False def is_empty (self): if (self .__ front> self .__ rear): return True return False def enqueue (self, data): if (self.is_full ()): print ('Queue is full !!!') else: self .__ rear + = 1 self .__ elements [self .__ rear] = data def dequeue (self): if (self.is_empty ()): print ('Queue is empty! !! ') else: data = self .__ elements [self .__ front] self .__ front + = 1 return data def display (self): for index in range (self .__ front, self .__ rear + 1): print (self .__ elements [index]) def get_max_size (self): návrat self .__ max_size # Můžete použít níže uvedený __str __ () k tisku prvků objektu DS, zatímco #debugging def __str __ (self): msg = [] index = self .__ front while (index<=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()
Výstup:
doc1-5 odeslán k tisku
doc2-3 odeslán k tisku
doc3-6 odeslán k tisku
tištěný dokument 1-5
Zbývající č. stránek v tiskárně: 7
doc2-3 tištěný
Zbývající č. stránek v tiskárně: 4
Nelze tisknout dokument doc3. V tiskárně není dostatek stránek
- Příklad 2:
Zkusme pochopit další příklad, který využívá datovou strukturu fronty. Můžete se pokusit porozumět kódu a říct, co dělá následující funkce?
- def fun (n):
- aqueue = Fronta (100)
- pro číslo v rozsahu (1, n + 1):
- zařazení do fronty (počet)
- výsledek = 1
- while (not (aqueue.is_empty ())):
- num = AQUUE.DEQUEUE ()
- výsledek * = počet
- tisk (výsledek)
Když je funkce fun () vyvolána předáním n,
- řádky 2 až 4 zařazují prvky do fronty od 1 do n
- řádky 5 až 8 naleznou součin těchto prvků postupným zařazením do fronty
S tímto se dostáváme na konec tohoto článku Queue Data Structure. Pokud jste úspěšně pochopili a spustili kódy sami, už nejste nováčkem v datové struktuře fronty.
Máte na nás dotaz? Uveďte to prosím v sekci komentářů tohoto článku a my se vám ozveme co nejdříve.
Chcete-li získat podrobné znalosti o Pythonu a jeho různých aplikacích, můžete se zaregistrovat naživo s nepřetržitou podporou a doživotním přístupem.