Mis on Pythoni korpuse andmestruktuurid?



See artikkel annab teile üksikasjalikud ja põhjalikud teadmised Pythoni korstna andmestruktuuride kohta koos paljude näidetega.

Andmestruktuurid on andmeväärtuste kogum, nendevahelised seosed ja funktsioonid või toimingud, mida saab andmetele rakendada. Nüüd on saadaval palju andmestruktuure. Kuid täna keskendume korstna andmestruktuuridele. Ma arutlen järgmistel teemadel:

Miks just andmestruktuurid?

Sellele vastamiseks peate mõtlema suurel tasandil. Mõelge, kuidas Google Maps näitab teile parimat marsruuti vaid mõne sekundi jooksul, kuidas see tagastab teie otsingutulemuse mikrosekundites. See ei tegele ainult 100 veebisaidiga, vaid üle miljardi saidiga ja näitab teile siiski nii kiiresti tulemusi.





Noh, kuigi kasutatud algoritm mängib otsustavat rolli, on selle algoritmi aluseks andmete struktuur või kasutatud konteiner. Igas rakenduses on andmete tõhusale juurdepääsule ja töötlemisele võtmetähtsusega andmete korraldamine ja säilitamine viisil, mis sobib kõige paremini selle kasutamiseks.

Andmestruktuuride tüübid

On olemas mõned standardsed andmestruktuurid, mida saab kasutada andmetega tõhusaks töötamiseks. Saame neid isegi kohandada või ehitada täiesti uusi, mis sobivad meie rakendusega.



Andme-struktuuri tüübid

Mis on korstna andmete struktuur?

Mõelge mõnele reaalsele elule mõeldud näiteid:

  • Saadetis lastina
  • Plaadid kandikul
  • Müntide virn
  • Sahtlite virn
  • Rongide manööverdamine raudteeõuel

plates-stacks-data-structure



Kõik need näited järgnevad a Last-in-first-out strateegia. Kaaluge plaadil olevaid plaate. Kui soovite plaati valida, olete sunnitud valima plaadi ülevalt, samal ajal kui plaate kandikul hoiti, peavad need olema vastupidises järjekorras. Ülaltoodud näidetele järgnevad näited Last-in-first-out (LIFO) põhimõtet tuntakse kui Virn .

Lisaks täiendavatele toimingutele võin öelda, et peamised virna võimalikud toimingud on:

  1. Lükake või pange element virna ülaossa
  2. Pop või eemaldage element virna ülaosast

Virnaandmete struktuuri loomine

klassi virna: def __init __ (ise, max_size): ise .__ max_size = max_size ise .__ elemendid = [puudub] * ise .__ max_size ise .__ üles = -1
  • max_size on virnas oodatavate elementide maksimaalne arv.
  • Virna elemendid salvestatakse pythoni loendisse.
  • Ülemine tähistab virna ülemist indeksit, mis võetakse tühja virna tähistamiseks esialgu -1.

Stacki algne olek on näha joonisel, kus max_size = 5

Lükake Element virna sisse

Kui soovite elementi virna sisestada või sinna lükata, peate seda meeles pidama

  • Ülemine osutab indeksile, kuhu element sisestatakse.
  • Ja kui virn on täis, st kui max_size = top, ei lisata ühtegi elementi.

Mis peaks siis olema algoritm ??

# tagastab virna def maksimaalse suuruse get_max_size (self): return self .__ max_size # tagastab bool-väärtuse olenemata sellest, kas virna on täis või mitte, True kui täis ja False muul juhul def is_full (self): tagastage self.get_max_size () - 1 == ise .__ top #pushes element virna ülaosas def push (ise, andmed): if (self.is_full ()): print ('virn on juba täis') muu: ise .__ top = ise .__ top + int (1 ) self .__ elements [self .__ top] = data # Võite kasutada järgmist __str __ () DS-objekti elementide printimiseks def __str __ (self) silumisel: msg = [] index = self .__ top while (index> = 0): msg.append ((str) (ise .__ elemendid [register])) register- = 1 msg = '' .join (msg) msg ​​= 'Andmete virnastamine (ülevalt alla):' + msg tagastab msg

Nüüd, kui täidate järgmist:

stack1 = virna (4)

#Lükake kõik vajalikud elemendid.

stack1.push („A”)

stack1.push (“B”)

stack1.push (“C”)

stack1.push (“E”)

print (stack1.is_full ())

print (virn1)

Väljund:

virn on juba täis
Tõsi
Virnade andmed (ülalt alla): D C B A

Popelemendid virnast

Nüüd, kui olete elemendid virna sisestanud, soovite need poputada, seega peate hoolitsema järgmise eest:

  • Virn pole tühi, s.t top! = -1
  • Andmete kustutamisel peab ülaosa osutama virna eelmisele ülaosale.

Mis saab siis algoritm ??

#returns tõeväärtus, kas virn on tühi või mitte, tõene, kui tühi ja vale, vastasel juhul on def is_empty (self): return self .__ top == - 1 #returns popped value def pop (self): if (self.is_empty ()): print ('midagi pole popi, juba tühi') muu: a = ise .__ elemendid [ise .__ ülemine] ise .__ ülemine = ise .__ ülemine-1 tagastavad #näidavad kõiki korstnaelemente ülevalt alla def-ekraan (ise): i jaoks vahemikus (ise .__ ülemine, -1, -1): print (ise .__ elemendid [i], lõpp = '') print ()

Arvestades varem loodud virna, proovige elemente poputada

print (stack1.pop ())

sorteeri massiiv c ++ keeles

print (stack1.pop ())

print (virn1)

print (stack1.pop ())

print (stack1.pop ())

print (stack1.pop ())

Väljund:

D

C

Virnade andmed (ülalt alla): B A

B

TO

pole midagi poputada, juba tühi

Virnaandmete struktuuri rakendused

  • Näide 1:

Virna kasutatakse sulgude sobitamise algoritmi juurutamiseks aritmeetilise avaldise hindamiseks ja ka meetodikutsete rakendamiseks.

Vastus on 5.

  • Näide 2:

Lõikelaud Windowsis kasutab undo-redo (ctrl + z, ctrl + y) toimingute rakendamiseks kahte virna. Oleksite töötanud Windowsi sõnatoimetajatega nagu MS-Word, Notepad jne. Siin on tekst, mis on kirjutatud MS-Wordis. Jälgige, kuidas tekst Ctrl-Z ja Ctrl-Y klõpsamisel muutus.

Siin on kood, mis simuleerib tagasivõtmise toimingut. Vaadake kood läbi ja vaadake, kuidas virna selles rakenduses kasutatakse.

#creami klassi virnaklass Stack: def __init __ (self, max_size): self .__ max_size = max_size self .__ elements = [None] * self .__ max_size self .__ top = -1 def is_full (self): if (self .__ top == ise .__ max_size-1): return True return False def is_empty (self): if (self .__ top == - 1): return True return False def push (self, data): if (self.is_full ()): print ('Virn on täis !!') else: self .__ top + = 1 self .__ elements [self .__ top] = data def pop (self): if (self.is_empty ()): print ('Virn on tühi! ! ') else: andmed = self .__ elemendid [self .__ top] ise .__ top- = 1 tagastavad andmed def kuva (ise): if (self.is_empty ()): print (' virn on tühi ') else: register = self .__ top while (indeks> = 0): print (self .__ elements [index]) index- = 1 def get_max_size (self): return self .__ max_size #Võite kasutada järgmist __str __ () DS-objekt silumisel def __str __ (self): msg = [] index = self .__ top while (index> = 0): msg.append ((str) (self .__ elements [index])) index- = 1 msg = ' '.join (msg) msg ​​=' Andmete virnastamine (ülevalt alla): '+ msg tagastab ms g # function eemaldamise või tagasilükkamise toimingu rakendamiseks def remove (): globaalne lõikelauale, undo_stack data = lõikelauale [len (lõikelauale) -1] lõikelauale. eemaldama (andmetele) undo_stack.push (andmetele) print ('Eemalda:', lõikelauale) # function undooperatsiooni rakendamiseks def undo (): globaalne lõikelauale, undo_stack, redo_stack if (undo_stack.is_empty ()): print ('tagasivõtmiseks pole andmeid') else: data = undo_stack.pop () clipboard.append ( data) redo_stack.push (data) print ('Võta tagasi:', lõikelauale) # funktsioon toimingu uuesti tegemiseks def redo (): globaalne lõikelauale, undo_stack, redo_stack if (redo_stack.is_empty ()): print ('Andmeid pole ümber tegema)) else: data = redo_stack.pop () if (andmed pole lõikelaual): print ('Ümbertegemiseks pole andmeid') redo_stack.push (andmed) else: lõikelaud.remove (data) undo_stack.push ( andmed) print ('Tee uuesti:', lõikelauale) lõikelauale = ['A', 'B', 'C', 'D', 'E', 'F'] undo_stack = Virna (len (lõikelauale)) redo_stack = Virna [len (lõikelauale)] eemalda () võta tagasi () tee uuesti ()

Väljund:

Eemalda: [’A’, ’B’, ‘C’, ‘D’, ‘E’]

Võta tagasi: [’A’, ’B’, ‘C’, ’D’, ‘E’, ‘F’]

Tee uuesti: [’A’, ’B’, ‘C’, ‘D’, ‘E’]

Sellega jõuame selle Pythoni artikli virnaandmete struktuuri lõpuni. Kui olete koodidest edukalt aru saanud ja neid ise käitanud, ei ole te enam Stacksi andmestruktuuri algaja.

Kas teil on meile küsimus? Palun mainige seda selle artikli kommentaaride jaotises ja võtame teiega ühendust niipea kui võimalik.

Põhjalike teadmiste saamiseks Pythoni ja selle erinevate rakenduste kohta saate registreeruda otseülekandeks 24/7 toe ja ligipääsuga kogu eluks.