Co to jest struktura danych kolejki w Pythonie?



W tym artykule znajdziesz szczegółową i wszechstronną wiedzę na temat struktur danych kolejek w języku Python wraz z wieloma przykładami.

Jak już dowiedziałeś się o znaczeniu struktur danych w poprzednim artykule, przejdźmy od razu do tematu artykułu, tj. Struktury danych kolejki. Będę omawiać następujące tematy:

Potrzeba struktury danych kolejki

Załóżmy, że pewnego dnia chcesz obejrzeć film. W multipleksie bilety były wydawane na zasadzie „kto pierwszy, ten lepszy”, a ludzie stali jeden za drugim, czekając na swoją kolej. Więc, co zrobisz?? Musiałeś przejść na tyły i stanąć za ostatnią osobą czekającą na bilet.





queue-data-structure

Tutaj ludzie stoją jeden za drugim i są obsługiwani w oparciu o Pierwszy przyszedł, pierwszy wyszedł (FIFO) mechanizm. Taki układ jest znany jako Kolejka.



jak przekonwertować binarne na dziesiętne w java

Przykłady kolejki w życiu codziennym

Rozważmy kilka przykładów, w których widzimy typ kolejki działający w życiu codziennym:

  • Automatyczna sekretarka Osoba, która zadzwoni jako pierwsza z Twojego gadżetu, zostanie włączona jako pierwsza.
  • Maszyna do sprawdzania bagażu - Sprawdza Bagaż, który był trzymany jako pierwszy na taśmie.
  • Pojazdy na moście płatno-podatkowym - Pojazdy przybywające wcześnie wyjeżdżają jako pierwsze.
  • Call Center - systemy telefoniczne będą korzystać z kolejek, aby utrzymywać osoby dzwoniące do nich do czasu zwolnienia przedstawiciela serwisu.

Wszystkie te przykłady podano poniżej Pierwszy przychodzi, ostatni wychodzi strategia.

Tworzenie struktury danych kolejki

Oprócz operacji komplementarnych mogę powiedzieć, że główne Operacje możliwe na Kolejce to:



jeden. W kolejce lub dodaj element na końcu kolejki.

2. Usuń kolejkę lub usuń element z początku kolejki

Teraz zacznijmy od stworzenia kolejki klas w Pythonie:

class Kolejka: def __init __ (self, max_size): self .__ max_size = max_size self .__ elements = [None] * self .__ max_size self .__ rear = -1 self .__ front = 0
  • największy rozmiar to maksymalna liczba elementów oczekiwanych w kolejce.
  • Elementy kolejki są przechowywane na liście Pythona
  • tył wskazuje pozycję indeksu ostatniego elementu w kolejce.
  • Z tyłu przyjmuje się początkowo wartość -1, ponieważ kolejka jest pusta
  • Front wskazuje pozycję pierwszego elementu w kolejce.
  • Front jest początkowo przyjmowany jako 0, ponieważ zawsze będzie wskazywał na pierwszy element kolejki

Umieść w kolejce

Teraz, gdy próbujesz umieścić elementy w kolejce do kolejki, musisz pamiętać o następujących kwestiach:

  • Czy w kolejce pozostało miejsce, czy nie, np. Czy tył jest równy max_size -1
  • Tył będzie wskazywał ostatni element wstawiony do kolejki.

Więc jaki będzie algorytm?

#returns max_size of queue def get_max_size (self): return self .__ max_size #returns bool value niezależnie od tego, czy kolejka jest pełna czy nie, True if full and False w przeciwnym razie def is_full (self): return self .__ rear == self .__ max_size-1 # wstawia / umieszcza dane w kolejce, jeśli nie są one pełne. def enqueue (self, data): if (self.is_full ()): print ('Queue is full. __elements [self .__ rear] = data #display całą zawartość kolejki def display (self): for i in range (0, self .__ rear + 1): print (self .__ elements [i]) #Możesz użyć poniżej __str __ (), aby wydrukować elementy obiektu DS podczas debugowania 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

Teraz, kiedy wykonasz następujące czynności:

queue1 = Queue (5)

# Kolejka wszystkich wymaganych elementów.

queue1.enqueue („A”)

queue1.enqueue („B”)

queue1.enqueue („C”)

queue1.enqueue („D”)

queue1.enqueue („E”)

queue1.display ()

queue1.enqueue („F”)

print (queue1)

Wynik:

DO

b

do

re

JEST

Kolejka jest pełna. Brak możliwości kolejkowania

Dane kolejki (od przodu do tyłu): A B C D E

Usuń kolejkę

Teraz, po wstawieniu / kolejkowaniu elementów do kolejki, chcesz usunąć z kolejki / usunąć je z przodu, więc musisz zadbać o następujące kwestie:

  • W kolejce są elementy, czyli tył nie powinien być równy -1.
  • Po drugie trzeba pamiętać, że skoro elementy są usuwane od frontu, to po usunięciu frontu należy inkrementować tak, aby wskazywał następny front.
  • Przód nie powinien wskazywać końca kolejki, tj. Równego max_size.

Więc jaki będzie algorytm?

# function do sprawdzenia, czy kolejka jest pusta, czy nie. def is_empty (self): if (self .__ rear == - 1 lub self .__ front == self .__ max_size): return True else: return False # function dequeelement i return it def dequeue (self): if (self.is_empty ()): print ('kolejka jest już pusta') else: data = self .__ elements [self .__ front] self .__ front + = 1 return data #function do wyświetlenia elementów z od przodu do tyłu jeśli kolejka nie jest pusta def display (self): if (not self.is_empty ()): for i in range (self .__ front, self .__ rear + 1): print (self .__ elementów [i]) else : print ('pusta kolejka')

Teraz, gdy wykonasz następujące czynności:

queue1 = Queue (5)

# Kolejka wszystkich wymaganych elementów

queue1.enqueue („A”)

queue1.enqueue („B”)

queue1.enqueue („C”)

queue1.enqueue („D”)

queue1.enqueue („E”)

print (queue1)

# Usuń z kolejki wszystkie wymagane elementy

print („Dequeued:“, queue1.dequeue ())

print („Dequeued:“, queue1.dequeue ())

print („Dequeued:“, queue1.dequeue ())

print („Dequeued:“, queue1.dequeue ())

print („Dequeued:“, queue1.dequeue ())

print („Dequeued:“, queue1.dequeue ())

# Wyświetl wszystkie elementy w kolejce.

queue1.display ()

Wynik:

Dane kolejki (od przodu do tyłu): A B C D E

Odkolejowany: A.

Odkolejowany: B.

Odkolejowany: C.

Odkolejowany: D.

Usunięte z kolejki: E.

kolejka jest już pusta

Usunięte z kolejki: brak

pusta kolejka

Zastosowania kolejki

Do tej pory znasz już podstawy kolejkowania. Teraz, aby zanurkować głębiej, przyjrzymy się niektórym z jego zastosowań.

  • Przykład 1:

Print Queue w systemie Windows używa kolejki do przechowywania wszystkich aktywnych i oczekujących zadań drukowania. Chcąc wydrukować dokumenty, wydajemy polecenia drukowania jedno po drugim. Na podstawie poleceń drukowania dokumenty zostaną ułożone w kolejce drukowania. Gdy drukarka będzie gotowa, dokument zostanie wysłany jako pierwszy w kolejności, aby mógł zostać wydrukowany.

Załóżmy, że wydałeś polecenia drukowania dla 3 dokumentów w kolejności doc1, a następnie doc2 i doc3.
Kolejka drukowania zostanie zapełniona, jak pokazano poniżej:

doc-n, gdzie doc to dokument wysłany do druku an, to liczba stron w dokumencie. Na przykład doc2-10 oznacza, że ​​ma zostać wydrukowany doc2 i ma 10 stron. Oto kod, który symuluje działanie kolejki wydruku. Przejdź przez kod i obserwuj, jak kolejka jest używana w tej implementacji.

class Kolejka: 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 .__ elementów [self .__ front] self .__ front + = 1 return data def display (self): for index in range (self .__ front, self .__ rear + 1): print (self .__ elementów [index]) def get_max_size (self): return self .__ max_size #Możesz użyć poniższej __str __ (), aby wydrukować elementy obiektu DS podczas #debugging def __str __ (self): msg = [] index = self .__ front while (indeks<=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()

Wynik:

doc1-5 wysłany do druku

doc2-3 wysłany do druku

doc3-6 wysłany do druku

doc1-5 wydrukowane

Pozostałe nr. stron w drukarce: 7

doc2-3 wydrukowane

Pozostałe nr. stron w drukarce: 4

Nie udało się wydrukować doc3. Za mało stron w drukarce

  • Przykład 2:

Spróbujmy zrozumieć inny przykład wykorzystujący strukturę danych kolejki. Czy możesz spróbować zrozumieć kod i powiedzieć, co robi następująca funkcja?

  1. def fun (n):
  2. aqueue = Queue (100)
  3. dla liczby w zakresie (1, n + 1):
  4. enqueue (num)
  5. wynik = 1
  6. while (nie (aqueue.is_empty ())):
  7. num = AQUUE.DEQUEUE ()
  8. wynik * = liczba
  9. print (wynik)

Gdy funkcja fun () jest wywoływana przez przekazanie n,

typ danych dla daty w sql
  • linie od 2 do 4 kolejkują elementy od 1 do n
  • linie od 5 do 8 znajdują iloczyn tych elementów, usuwając je z kolejki jeden po drugim

Na tym kończymy artykuł o strukturze danych kolejki. Jeśli pomyślnie zrozumieliście i samodzielnie uruchomiliście kody, nie jesteście już nowicjuszem w strukturze danych kolejki.

Masz do nas pytanie? Wspomnij o tym w sekcji komentarzy w tym artykule, a my skontaktujemy się z Tobą tak szybko, jak to możliwe.

Aby uzyskać dogłębną wiedzę na temat języka Python i jego różnych aplikacji, możesz zarejestrować się na żywo z całodobowym wsparciem i dożywotnim dostępem.