Stacks and LIFO Structures: implementációs és használati esetek

ezekkel a fontos módszerekkel áttekinthetjük a Stack osztályunk végső implementációját:

a push és pop módszerek pontosan úgy jelennek meg, ahogy vártuk (sorok13–32). Tudjuk használni a push módszer, hogy hozzon létre egy egyéni inicializáló néhány variadikus értékek (vonalak 7-11). Ezenkívül ellenőrizhetjük, hogy van-e üres verem, ha ellenőrizzük, hogy a rootNode-nak van-e értéke (34-36 sorok), és van-e egy alapvető nyomtatási módszer, amely iterálja a listánkat, amíg képes elérni a csomópontokat a következő tulajdonságon keresztül (38-44 sorok).

a verem funkcionalitásának alapvető tesztje így néz ki:

a verem megvalósításának ismerete egy dolog, de még fontosabb az olyan helyzetek felismerése, amelyekre a verem alkalmas. A következő részben három ilyen esetet fogunk megvizsgálni.

1. Használati Eset: Fordított sorrend

mivel a verem sorrendje rögzített, a fordított sorrend nagyon könnyen elérhető, ha az elemeket az egyik veremből azonnal a másikra pattintja. Nem szórakozni csere indexek!

2. eset: szimmetria tesztelése

a stackek másik jó felhasználási esete a szimmetria tesztelése. Az alábbi példában egy zárójelsorozatot tesztelünk annak biztosítására, hogy minden záró konzol a korábbi nyitó konzol megfelelő megfelelője legyen.

először ellenőrizzük, hogy a karakterszám osztható-e kettővel, mivel páratlan számú karakter azonnal aszimmetrikus lenne (6.sor). Ezután ellenőrizzük, hogy van-e érvényes bemenetünk az illegális karakterek karakterkészletének meghatározásával, majd annak ellenőrzésével, hogy a bemeneti karakterláncunk nulla illegális karaktertartományban van-e (7-8 sorok). Annak ellenőrzéséhez, hogy a záró és nyitó zárójelek egyeznek-e, kulcs-érték párokként írjuk be őket egy szótárba (10.sor). Más helyzetekben kiszámíthatja az inverz értéket anélkül, hogy párokat kellene tárolnia egy szótárban. Aztán megvan a veremünk (11.sor). A veremünk célja ebben az esetben a nyitó zárójelek tárolása. Ahogy végigjárjuk a Karakterláncunkat, ellenőrizhetjük, hogy karakterünk nyitó zárójel-e, tesztelve, hogy Kulcs-e a szótárunkban. Ha igen, akkor rátoljuk a veremre. Miután megtaláltuk az első zárt zárójelünket, tudjuk, hogy a mintánk második felén dolgozunk, ezért az első fél logikai értéket hamisra állítottuk (12.sor). Ha ennél a pontnál több zárójelet találunk, ellenőrizhetjük a logikai értéket, és jelezhetjük a sikertelen tesztet. Minden záró zárójelhez leugrunk az utolsó nyitó zárójelről, és ellenőrizzük, hogy helyes-e a kulcs-érték pár. Ismét csak egyszer kell iterálnunk a karakterláncot, így sok értéket kapunk egy lineáris algoritmusból.

3. eset használata: parancsok visszavonása

végül egy köteget fogunk használni a parancsmintával együtt, hogy visszavonási előzményeket hozzunk létre. Először vessünk egy pillantást egy egyszerű bankszámla objektumra. Van egyenlege és folyószámlahitel-korlátja, valamint néhány egyszerű módszer a pénzeszközök letétbe helyezésére és visszavonására:

ahelyett, hogy közvetlenül hívnánk a befizetési és visszavonási módszereket, a vonatkozó információkat egy parancsban tárolhatjuk. Az alábbi részletben megadjuk, hogy milyen műveletet akarunk végrehajtani egy enum tulajdonsággal (befizetés vagy kifizetés) és egy összeggel . Egy logikai értéket is tárolunk annak jelzésére, hogy a parancs végrehajtható-e (4-11 sorok). Vegye figyelembe, hogy ha a kifizetési kérelem meghaladja a folyószámlahitel korlátját, semmi sem történik a bankszámlával, és a sikeres logikai érték hamis marad, különben a parancs befejezése után igaz lesz (18-26 sorok). Két módszerünk van a parancs meghívására vagy visszavonására, mindegyik bankszámlát vesz argumentumként (18 sor & 28). Ezek a módszerek a bankszámlát veszik, és meghívják a példány metódusait, amelyeket az előző részletben láttunk.

visszatérve a bankszámlára, most bemutathatjuk a commandStack tulajdonságunkat, amelyet Inicializáltunk a BankAccountType (47.sor) segítségével. A befizetési és kifizetési módjainkat fileprivate-ként jelöljük meg, hogy csak a Bankfiókparancsunk férhessen hozzá (62.sor & 66). Most két exponált módszerünk van: process(command:) és undoLastCommand(). Az első Elfogad egy parancsot bemenetként, végrehajtja azt a bankszámlával bemenetként, majd a parancsot a veremre tolja. Közben a undoLastCommand metódus, kiugrik az utolsó parancsot a veremből, és végrehajtja a visszavonás (vonalak 51-60).

ez egy nagyon egyszerű minta, amely nagyon erős. A lehetséges alkalmazások végtelenek, és kielégítő felhasználói élményt nyújtanak.

most nézzük meg a mintát a cselekvésben:

Wrap Up

ebben a cikkben a stack és a LIFO viselkedés fogalmát vizsgáltuk. A saját veremünket kétszeresen összekapcsolt listával valósítottuk meg, és bemutattuk, hogyan osztja ki és osztja el a memóriát a verem méretének változásával. Megvizsgáltuk a stackek három gyakori felhasználási esetét is: megfordítás, szimmetria tesztelése és visszavonás. E három helyzet mindegyike számtalanszor felmerül a valós projektekben. Remélem, hogy egy kötegre úgy fog gondolni, mint egy megfelelő struktúrára ezen igények kezelésére. Mint mindig, köszönöm az olvasást!

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.

More: