Was ist die Warteschlangendatenstruktur in Python?



Dieser Artikel bietet Ihnen ein detailliertes und umfassendes Wissen über Warteschlangendatenstrukturen in Python mit vielen Beispielen.

Da Sie bereits im vorherigen Artikel die Bedeutung von Datenstrukturen untersucht haben, gehen wir direkt auf das Thema des Artikels ein, d. H. Die Warteschlangendatenstruktur. Ich werde die folgenden Themen diskutieren:

Notwendigkeit einer Warteschlangendatenstruktur

Angenommen, Sie möchten eines Tages einen Film. Im Multiplex wurden die Tickets nach dem Prinzip 'Wer zuerst kommt, mahlt zuerst' ausgestellt, und die Leute standen hintereinander und warteten darauf, dass sie an die Reihe kamen. Also, was wirst du tun?? Sie müssen nach hinten gegangen sein und hinter der letzten Person gestanden haben, die auf das Ticket gewartet hat.





queue-data-structure

Hier stehen die Menschen hintereinander und werden auf der Grundlage der First-In-First-Out (FIFO) Mechanismus. Eine solche Anordnung ist bekannt als Warteschlange.



Beispiele für Warteschlangen im täglichen Leben

Betrachten wir einige Beispiele, bei denen wir einen Warteschlangentyp sehen, der im täglichen Leben arbeitet:

  • Anrufbeantworter- Die Person, die Ihr Gadget zuerst anruft, wird zuerst besucht.
  • Gepäckkontrolle - Überprüft das Gepäck, das zuerst auf dem Förderband aufbewahrt wurde.
  • Fahrzeuge auf der Mautsteuerbrücke - Die früh ankommenden Fahrzeuge fahren zuerst ab.
  • Call-Center - Telefonsysteme verwenden Warteschlangen, um die anrufenden Personen in der richtigen Reihenfolge zu halten, bis ein Servicemitarbeiter frei ist.

Alle diese Beispiele folgen First-In-Last-Out Strategie.

Erstellen einer Warteschlangendatenstruktur

Abgesehen von den ergänzenden Operationen kann ich sagen, dass die wichtigsten Operationen, die in der Warteschlange möglich sind, sind:



ein. En-queue oder fügen Sie am Ende der Warteschlange ein Element hinzu.

2. Warteschlange abstellen oder entfernen Sie ein Element von der Vorderseite der Warteschlange

Beginnen wir nun mit dem Erstellen der Klassenwarteschlange in Python:

Klassenwarteschlange: def __init __ (self, max_size): self .__ max_size = max_size self .__ elements = [None] * self .__ max_size self .__ hinten = -1 self .__ front = 0
  • maximale Größe ist die maximale Anzahl von Elementen, die in der Warteschlange erwartet werden.
  • Elemente der Warteschlange werden in der Python-Liste gespeichert
  • hinten zeigt die Indexposition des letzten Elements in der Warteschlange an.
  • Die Rückseite wird anfänglich als -1 angenommen, da die Warteschlange leer ist
  • Front zeigt die Position des ersten Elements in der Warteschlange an.
  • Die Front wird anfangs als 0 angenommen, da sie immer auf das erste Element der Warteschlange zeigt

Enqueue

Wenn Sie nun versuchen, Elemente in die Warteschlange zu stellen, müssen Sie die folgenden Punkte beachten:

  • Ob noch Platz in der Warteschlange vorhanden ist oder nicht, d. H. Wenn hinten gleich max_size -1 ist
  • Die Rückseite zeigt auf das letzte in die Warteschlange eingefügte Element.

Also, was wird der Algorithmus sein?

#returns max_size der Warteschlange def get_max_size (self): return self .__ max_size #returns bool value ob die Warteschlange voll ist oder nicht, True wenn voll und False sonst def is_full (self): return self .__ hinten == self .__ max_size-1 # fügt Daten in die Warteschlange ein / stellt sie in die Warteschlange, wenn sie nicht vollständig sind. def enqueue (self, data): if (self.is_full ()): print ('Warteschlange ist voll. Keine Warteschlange möglich') else: self .__ hinten + = 1 self. __elements [self .__ hinten] = Daten #display den gesamten Inhalt der Warteschlange def Anzeige (self): für i im Bereich (0, self .__ hinten + 1): print (self .__ Elemente [i]) #Sie können die verwenden unter __str __ (), um die Elemente des DS-Objekts beim Debuggen von def __str __ (self) zu drucken: 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

Nun, wenn Sie Folgendes ausführen:

queue1 = Queue (5)

# Alle erforderlichen Elemente in die Warteschlange stellen.

queue1.enqueue ('A')

queue1.enqueue ('B')

Was ist .format in Python

queue1.enqueue ('C')

queue1.enqueue ('D')

queue1.enqueue ('E')

queue1.display ()

queue1.enqueue ('F')

print (queue1)

Ausgabe:

ZU

B.

C.

D.

IS

Die Warteschlange ist voll. Keine Warteschlange möglich

Warteschlangendaten (von vorne nach hinten): A B C D E.

Warteschlange entfernen

Nachdem Sie die Elemente in die Warteschlange eingefügt / in die Warteschlange gestellt haben, möchten Sie sie von vorne in die Warteschlange stellen / löschen. Daher müssen Sie Folgendes beachten:

  • Es gibt Elemente in der Warteschlange, d. H. Die Rückseite sollte nicht gleich -1 sein.
  • Zweitens müssen Sie sich daran erinnern, dass beim Löschen von Elementen von vorne die Anzahl nach dem Löschen der Vorderseite erhöht werden sollte, um auf die nächste Vorderseite zu zeigen.
  • Die Vorderseite sollte nicht auf das Ende der Warteschlange zeigen, d. H. Gleich max_size.

Also, was wird der Algorithmus sein?

#Funktion zum Überprüfen, ob die Warteschlange leer ist oder nicht def is_empty (self): if (self .__ hinten == - 1 oder self .__ front == self .__ max_size): return True else: return False #Funktion, um ein Element zu entfernen und zurückzugeben it def dequeue (self): if (self.is_empty ()): print ('Warteschlange ist bereits leer') else: data = self .__ elements [self .__ front] self .__ front + = 1 gibt data #function zurück, um Elemente von anzuzeigen von vorne nach hinten, wenn die Warteschlange nicht leer ist def display (self): if (nicht self.is_empty ()): für i im Bereich (self .__ front, self .__ hinten + 1): print (self .__ elements [i]) else : print ('leere Warteschlange')

Wenn Sie nun Folgendes ausführen:

queue1 = Queue (5)

# Alle erforderlichen Elemente in die Warteschlange stellen

queue1.enqueue ('A')

queue1.enqueue ('B')

queue1.enqueue ('C')

queue1.enqueue ('D')

queue1.enqueue ('E')

print (queue1)

# Alle erforderlichen Elemente aus der Warteschlange entfernen

print ('Dequeued:', queue1.dequeue ())

print ('Dequeued:', queue1.dequeue ())

print ('Dequeued:', queue1.dequeue ())

print ('Dequeued:', queue1.dequeue ())

print ('Dequeued:', queue1.dequeue ())

print ('Dequeued:', queue1.dequeue ())

# Zeigen Sie alle Elemente in der Warteschlange an.

queue1.display ()

Ausgabe:

Warteschlangendaten (von vorne nach hinten): A B C D E.

In die Warteschlange gestellt: A.

In die Warteschlange gestellt: B.

In die Warteschlange gestellt: C.

In die Warteschlange gestellt: D.

In die Warteschlange gestellt: E.

Warteschlange ist bereits leer

Dequeued: Keine

leere Warteschlange

Anwendungen der Warteschlange

Ab sofort haben Sie die Grundlagen der Warteschlange bereits verstanden. Um tiefer zu tauchen, werden wir uns einige seiner Anwendungen ansehen.

  • Beispiel 1:

Warteschlange in Windows drucken Verwendet eine Warteschlange zum Speichern aller aktiven und ausstehenden Druckaufträge. Wenn wir Dokumente drucken möchten, geben wir nacheinander Druckbefehle aus. Basierend auf den Druckbefehlen werden die Dokumente in der Druckwarteschlange ausgerichtet. Wenn der Drucker bereit ist, wird das Dokument zuerst in der Reihenfolge des ersten Ausgangs gesendet, damit es gedruckt werden kann.

Angenommen, Sie haben Druckbefehle für 3 Dokumente in der Reihenfolge doc1 ausgegeben, gefolgt von doc2 und doc3.
Die Druckwarteschlange wird wie folgt gefüllt:

doc-n, wobei das doc das zum Drucken gesendete Dokument ist und n, ist die Anzahl der Seiten im Dokument. Zum Beispiel bedeutet doc2-10, dass doc2 gedruckt werden soll und 10 Seiten hat. Hier ist ein Code, der den Betrieb der Druckwarteschlange simuliert. Gehen Sie den Code durch und beobachten Sie, wie die Warteschlange in dieser Implementierung verwendet wird.

Klassenwarteschlange: def __init __ (self, max_size): self .__ max_size = max_size self .__ elements = [None] * self .__ max_size self .__ hinten = -1 self .__ front = 0 def is_full (self): if (self .__ hinten = = self .__ max_size-1): return True return False def is_empty (self): if (self .__ front> self .__ hinten): return True return False def enqueue (self, data): if (self.is_full ()): print ('Warteschlange ist voll !!!') else: self .__ hinten + = 1 self .__ Elemente [self .__ hinten] = data def dequeue (self): if (self.is_empty ()): print ('Queue ist leer! !! ') else: data = self .__ elements [self .__ front] self .__ front + = 1 return data def display (self): für Index im Bereich (self .__ front, self .__ hinten + 1): print (self .__ elements [index]) def get_max_size (self): return self .__ max_size #Sie können das folgende __str __ () verwenden, um die Elemente des DS-Objekts zu drucken, während #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()

Ausgabe:

doc1-5 wird zum Drucken gesendet

doc2-3 wird zum Drucken gesendet

doc3-6 zum Drucken gesendet

doc1-5 gedruckt

Verbleibende Nr. Anzahl der Seiten im Drucker: 7

doc2-3 gedruckt

Verbleibende Nr. Anzahl der Seiten im Drucker: 4

Doc3 konnte nicht gedruckt werden. Nicht genügend Seiten im Drucker

  • Beispiel 2:

Versuchen wir, ein anderes Beispiel zu verstehen, das die Warteschlangendatenstruktur verwendet. Können Sie versuchen, den Code zu verstehen und zu erklären, was die folgende Funktion bewirkt?

  1. def fun (n):
  2. aqueue = Queue (100)
  3. für num im Bereich (1, n + 1):
  4. Enqueue (num)
  5. Ergebnis = 1
  6. while (nicht (aqueue.is_empty ())):
  7. num = AQUUE.DEQUEUE ()
  8. Ergebnis * = num
  9. drucken (Ergebnis)

Wenn die Funktion fun () durch Übergeben von n aufgerufen wird,

  • In den Zeilen 2 bis 4 werden die Elemente von 1 bis n in die Warteschlange gestellt
  • In den Zeilen 5 bis 8 wird das Produkt dieser Elemente gefunden, indem sie einzeln aus der Warteschlange entfernt werden

Damit sind wir am Ende dieses Artikels zur Warteschlangendatenstruktur angelangt. Wenn Sie die Codes erfolgreich verstanden und selbst ausgeführt haben, sind Sie kein Neuling mehr in der Warteschlangendatenstruktur.

Hast du eine Frage an uns? Bitte erwähnen Sie es im Kommentarbereich dieses Artikels und wir werden uns so schnell wie möglich bei Ihnen melden.

Um detaillierte Informationen zu Python und seinen verschiedenen Anwendungen zu erhalten, können Sie sich live anmelden mit 24/7 Support und lebenslangem Zugriff.