Kas ir rindas datu struktūra Python?



Šis raksts sniegs jums detalizētas un visaptverošas zināšanas par rindas datu struktūrām Python, izmantojot daudz piemēru.

Kā jau iepriekšējā rakstā esat izpētījis datu struktūru nozīmi, ļaujiet ienirt tieši raksta tēmā, t.i., rindas datu struktūra. Es apspriedīšu šādas tēmas:

Vajadzība pēc rindas datu struktūras

Pieņemsim, ka kādu dienu vēlaties filmu. Multipleksā biļetes tika izsniegtas, pamatojoties uz “Pirmais, pirmais, pirmais kalpoju” principu, un cilvēki stāvēja aiz otra un gaidīja savu kārtu. Tātad, ko jūs darīsit ?? Jums noteikti jāiet aizmugurē un jāstājas aiz pēdējās personas, kas gaida biļeti.





queue-data-structure

Šeit cilvēki stāv viens aiz otra, un viņus apkalpo, pamatojoties uz First-in-first-out (FIFO) mehānisms. Šāda vienošanās ir pazīstama kā a Rinda.



Ikdienas dzīves rindas piemēri

Apskatīsim dažus piemērus, kur ikdienas dzīvē mēs strādājam ar rindas veidu:

  • Tālruņa atbildētāja sistēma- Persona, kas vispirms zvana, izmantojot jūsu sīkrīku, vispirms tiek apmeklēta.
  • Bagāžas pārbaudes mašīna - Pārbaudiet bagāžu, kas vispirms tika turēta uz konveijera lentes.
  • Transportlīdzekļi uz nodevas nodokļa tilta - Agrāk braucošie transportlīdzekļi izbrauc pirmie.
  • Zvanu centrs - tālruņa sistēmas izmantos rindas, lai uzturētu kārtībā cilvēkus, kuri viņiem zvana, līdz dienesta pārstāvis ir brīvs.

Visi šie piemēri seko First-In-Last-Out stratēģiju.

Rindas datu struktūras izveide

Papildus papildu operācijām es varu teikt, ka galvenās rindā iespējamās operācijas ir:



viens. Rindā vai pievienojiet elementu rindas beigās.

2. No rindas vai noņemiet elementu no rindas priekšpuses

Sāksim, izveidojot klases rindu Python:

klases rinda: def __init __ (self, max_size): self .__ max_size = max_size self .__ elementi = [Neviens] * self .__ max_size self .__ aizmugure = -1 self .__ front = 0
  • max_size ir maksimālais rindā gaidāmo elementu skaits.
  • Rindas elementi tiek glabāti pitonu sarakstā
  • aizmugure norāda rindas pēdējā elementa indeksa pozīciju.
  • Sākumā tiek uzskatīts, ka aizmugure ir -1, jo rinda ir tukša
  • Priekšpuse norāda pirmā elementa pozīciju rindā.
  • Sākotnēji tiek uzskatīts, ka priekšpuse ir 0, jo tā vienmēr norādīs uz rindas pirmo elementu

Enqueue

Kad mēģināt rindā iekļaut elementus, jums jāatceras šādi punkti:

  • Neatkarīgi no tā, vai rindā ir atstāta vieta, vai nav, t.i., ja aizmugure ir vienāda ar max_size -1
  • Aizmugure norādīs uz pēdējo rindā ievietoto elementu.

Tātad, kāds būs algoritms ??

#returns rindas max_size def get_max_size (self): return self .__ max_size #returns Bool value neatkarīgi no tā, vai rinda ir pilna, vai ne, True, ja pilna un False citādi def is_full (self): return self .__ rear == self .__ max_size-1 # ievieto / ievieto datus rindā, ja tas nav pilns def enqueue (sevis, dati): if (self.is_full ()): print ('Rinda ir pilna. Enqueue nav iespējama') cits: self .__ aizmugure + = 1 sevis. __elements [self .__ rear] = data #parāda visu rindas def displeja saturu (self): i diapazonā (0, self .__ aizmugure + 1): print (self .__ elementi [i]) # Varat izmantot zem __str __ (), lai drukātu DS objekta elementus, atkļūdojot 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

Tagad, kad izpildāt sekojošo:

1. rinda = Rinda (5)

#Izvēliet visus nepieciešamos elementus.

queue1.enqueue (“A”)

queue1.enqueue (“B”)

queue1.enqueue (“C”)

queue1.enqueue (“D”)

queue1.enqueue (“E”)

queue1.display ()

queue1.enqueue (“F”)

drukāt (1. rinda)

pitona klase __init__

Izeja:

TO

B

C

D

IS

Rinda ir pilna. Nav iespējama enqueue

Rindas dati (no priekšas uz aizmuguri): A B C D E

De-rinda

Kad esat ievietojis / ievietojis elementus rindā, vēlaties tos noņemt / izdzēst no priekšpuses, tāpēc jums jārūpējas par sekojošo:

  • Rindā ir elementi, t.i., aizmugure nedrīkst būt vienāda ar -1.
  • Otrkārt, jums jāatceras, ka, tā kā elementi tiek dzēsti no priekšpuses, pēc priekšdaļas izdzēšanas ir jāpalielina līdz nākamajai priekšpusei.
  • Priekšpusē nedrīkst norādīt rindas beigu daļu, t.i., vienāds ar max_size.

Tātad, kāds būs algoritms ??

# funkcija, lai pārbaudītu, vai rinda ir tukša, vai nav def is_empty (self): if (self .__ aizmugure == - 1 vai self .__ front == self .__ max_size): return Patiesais cits: return False # funkcija, lai atceltu elementu un atgrieztos it def dequeue (self): if (self.is_empty ()): print ('rinda jau ir tukša') cits: data = self .__ elementi [self .__ front] self .__ front + = 1 atgriežas dati # function, lai parādītu elementus no no priekšas uz aizmuguri, ja rinda nav tukša, def displejs (pats): ja (nav self.is_empty ()): i diapazonā (self .__ front, self .__ aizmugure + 1): print (self .__ elementi [i]) cits : drukāt ('tukša rinda')

Tagad, kad izpildāt sekojošo:

1. rinda = Rinda (5)

#Izvēliet visus nepieciešamos elementus

queue1.enqueue (“A”)

queue1.enqueue (“B”)

queue1.enqueue (“C”)

queue1.enqueue (“D”)

queue1.enqueue (“E”)

drukāt (1. rinda)

html tags līnijas pārtraukumam

#Dequeue visi nepieciešamie elementi

drukāt (“Dequeued:“, queue1.dequeue ())

drukāt (“Dequeued:“, queue1.dequeue ())

drukāt (“Dequeued:“, queue1.dequeue ())

drukāt (“Dequeued:“, queue1.dequeue ())

drukāt (“Dequeued:“, queue1.dequeue ())

drukāt (“Dequeued:“, queue1.dequeue ())

#Rādīt visus rindas elementus.

queue1.display ()

Izeja:

Rindas dati (no priekšas uz aizmuguri): A B C D E

Novilkts: A

Novilkts: B

Novilkts: C

Novilkts: D

Novilkts: E

rinda jau ir tukša

Novilkts: nav

tukša rinda

Rindas pieteikumi

Pašlaik jūs jau esat sapratuši rindas pamatus. Tagad, lai ienirtu dziļāk, mēs izpētīsim dažus tā lietojumus.

  • 1. piemērs:

Drukas rinda operētājsistēmā Windows izmanto rindu, lai saglabātu visus aktīvos un gaidošos drukas darbus. Kad mēs vēlamies izdrukāt dokumentus, mēs izdodam drukas komandas viena pēc otras. Pamatojoties uz drukāšanas komandām, dokumenti tiks ierindoti drukas rindā. Kad printeris ir gatavs, dokuments tiks iesūtīts pirmais iekšā, lai izdrukātu.

Pieņemsim, ka esat izdojis drukāšanas komandas 3 dokumentiem secībā doc1, kam seko doc2 un doc3.
Drukas rinda tiks aizpildīta, kā parādīts zemāk:

doc-n, kur dok ir dokuments, kas nosūtīts drukāšanai, un n, ir dokumenta lappušu skaits. Piemēram, doc2-10 nozīmē, ka dok2 ir jādrukā un tam ir 10 lapas. Šeit ir kods, kas imitē drukas rindas darbību. Izskatiet kodu un novērojiet, kā rinda tiek izmantota šajā ieviešanā.

klases rinda: def __init __ (self, max_size): self .__ max_size = max_size self .__ elementi = [Neviens] * self .__ max_size self .__ aizmugure = -1 self .__ front = 0 def is_full (self): ja (self .__ aizmugure = = 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 ('Rinda ir pilna !!!') cits: self .__ aizmugure + = 1 self .__ elementi [self .__ aizmugure] = data def dequeue (self): if (self.is_empty ()): print ('Rinda ir tukša! !! ') else: data = self .__ elements [self .__ front] self .__ front + = 1 return data def display (self): diapazona indeksam (self .__ front, self .__ aizmugure + 1): print (self .__ elementi [index]) def get_max_size (self): return self .__ max_size # Varat izmantot tālāk norādīto __str __ (), lai izdrukātu DS objekta elementus, bet #debugging def __str __ (self): msg = [] index = self .__ front, kamēr (indekss<=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()

Izeja:

doc1-5 nosūtīts drukāšanai

doc2-3 nosūtīts drukāšanai

doc3-6 nosūtīts drukāšanai

doc1-5 iespiests

Atlikušais Nr. lappuses printerī: 7

doc2-3 iespiests

Atlikušais Nr. lappuses printerī: 4

Nevarēja izdrukāt doc3. Printerī nav pietiekami daudz lapu

  • 2. piemērs:

Mēģināsim saprast vēl vienu piemēru, kurā izmantota rindas datu struktūra. Vai varat mēģināt saprast kodu un pateikt, ko dara šī funkcija?

  1. def jautri (n):
  2. aqueue = Rinda (100)
  3. skaitlim diapazonā (1, n + 1):
  4. enqueue (num)
  5. rezultāts = 1
  6. while (nav (aqueue.is_empty ())):
  7. num = AQUUE.DEQUEUE ()
  8. rezultāts * = skaitlis
  9. izdrukāt (rezultāts)

Ja funkcija fun () tiek izsaukta, nododot n,

  • no 2. līdz 4. rindai elementi tiek rindoti no 1 līdz n
  • 5. līdz 8. rinda atrod šo elementu reizinājumu, atstājot to rindā pa vienam

Ar to mēs esam nonākuši šajā rindas datu struktūras rakstā. Ja paši veiksmīgi sapratāt un izpildījāt kodus, jūs vairs neesat rindas datu struktūras iesācējs.

Vai mums ir jautājums? Lūdzu, pieminējiet to šī raksta komentāru sadaļā, un mēs sazināsimies ar jums pēc iespējas ātrāk.

Lai iegūtu padziļinātas zināšanas par Python kopā ar dažādām lietojumprogrammām, varat reģistrēties tiešraidē ar diennakts atbalstu un piekļuvi visu mūžu.