cu aceste metode importante explicate, să aruncăm o privire la implementarea finală a clasei noastre de stive:
metodele push și pop apar exact așa cum ne așteptăm (liniile13–32). Putem folosi metoda noastră push pentru a crea un inițializator personalizat cu unele valori variadice (liniile 7-11). În plus, putem verifica dacă există o stivă goală verificând dacă rootNode-ul nostru are o valoare (liniile 34-36) și are o metodă de imprimare de bază care iterează prin lista noastră atâta timp cât este capabil să acceseze noduri prin următoarea proprietate (liniile 38-44).
un test de bază al funcționalității stivei noastre arată astfel:
a ști cum să implementezi o stivă este un lucru, dar și mai important este recunoașterea situațiilor pentru care o stivă este potrivită. În această secțiune următoare vom analiza trei astfel de cazuri.
Cazul De Utilizare 1: Ordinea inversă
deoarece ordinea unei stive este fixă, ordinea inversă poate fi realizată foarte ușor prin scoaterea elementelor dintr-o stivă și imediat pe alta. Nu încurcați în jurul valorii de cu indici schimbarea!
utilizați Cazul 2: Testarea simetriei
un alt caz bun de utilizare pentru stive este testarea simetriei. În exemplul de mai jos, testăm un șir de paranteze pentru a ne asigura că fiecare suport de închidere este omologul corect al unui suport de deschidere anterior.
începem prin a verifica dacă numărul de caractere este divizibil cu două, așa cum un număr impar de caractere ar fi imediat asimetric (linia 6). Apoi, verificăm dacă avem intrare validă definind un set de caractere de caractere ilegale și apoi verificând dacă șirul nostru de intrare are o gamă nulă de caractere ilegale (liniile 7-8). Pentru a verifica parantezele noastre de închidere și deschidere sunt o potrivire, le-am pus într-un dicționar ca perechi cheie-valoare (linia 10). În alte situații, este posibil să puteți calcula valoarea inversă fără a fi nevoie să stocați perechi într-un dicționar. Apoi avem stiva noastră (linia 11). Scopul stivei noastre în acest caz este de a stoca paranteze de deschidere. Pe măsură ce repetăm șirul nostru, putem verifica dacă personajul nostru este o paranteză de deschidere testând dacă este o cheie în dicționarul nostru. Dacă este, îl împingem pe stiva noastră. Odată ce găsim prima noastră paranteză închisă, știm că lucrăm prin a doua jumătate a modelului nostru, așa că ne-am setat prima jumătate boolean la fals (linia 12). Dacă mai găsim paranteze de deschidere după acest punct, putem verifica booleanul și indica un test eșuat. Pentru fiecare paranteză de închidere, scoatem ultima paranteză de deschidere și verificăm dacă sunt o pereche corectă cheie-valoare. Încă o dată, trebuie doar să repetăm șirul o dată, așa că obținem multă valoare dintr-un algoritm liniar.
utilizați Cazul 3: anularea comenzilor
în cele din urmă, vom folosi o stivă împreună cu modelul de comandă, pentru a crea un istoric de anulare. Pentru a începe, să aruncăm o privire la un simplu obiect de cont bancar. Are un sold și o limită de descoperit de cont și câteva metode simple de depunere și retragere a fondurilor:
în loc să apelăm direct metodele de depunere și retragere, putem stoca informațiile relevante într-o comandă. În fragmentul de mai jos, specificăm ce fel de acțiune dorim să efectuăm cu o proprietate enum (depunere sau retragere) și o sumă . De asemenea, stocăm un boolean pentru a indica dacă comanda a putut fi executată (liniile 4-11). Observați că, dacă cererea de retragere depășește limita de descoperit de cont, nu se va întâmpla nimic cu contul bancar și booleanul reușit va rămâne fals, altfel va deveni adevărat odată ce comanda a fost finalizată (liniile 18-26). Avem două metode pentru apelarea sau anularea comenzii, fiecare luând un cont bancar ca argument (liniile 18 & 28). Aceste metode iau contul bancar și numesc metodele sale de instanță pe care le-am văzut în fragmentul anterior.
revenind la contul bancar, putem introduce acum proprietatea noastră commandStack, care a fost inițializată cu BankAccountType (linia 47). Marcăm metodele noastre de depunere și retragere ca fișiere private, astfel încât acestea să poată fi accesate numai de către BankAccountCommand (liniile 62 & 66). Acum avem două metode expuse: proces(comandă:) și undoLastCommand(). Primul acceptă o comandă ca intrare, o execută cu contul bancar ca intrare și apoi împinge comanda pe stivă. Între timp, metoda undoLastCommand, apare ultima comandă de pe stivă și efectuează o undo (linii 51-60).
acesta este un model foarte simplu și unul foarte puternic. Aplicațiile posibile sunt nesfârșite și asigură o experiență satisfăcătoare a utilizatorului.
și acum să vedem modelul în acțiune:
Wrap Up
în acest articol, am explorat conceptul de stivă și comportamentul LIFO. Am implementat propria stivă folosind o listă dublu legată și am demonstrat cum alocă și alocă memoria pe măsură ce dimensiunea stivei se modifică. De asemenea, am analizat trei cazuri comune de utilizare pentru stive: inversarea, testarea simetriei și anularea. Fiecare dintre aceste trei situații apar de nenumărate ori în proiecte din lumea reală. Sper că vă veți gândi la o stivă ca o structură adecvată pentru gestionarea acestor nevoi. Ca întotdeauna, vă mulțumesc pentru lectură!