Stabler Og LIFO-Strukturer: Implementerings-Og Brukstilfeller

med disse viktige metodene forklart, kan vi se på den endelige implementeringen av Stack-klassen Vår:

push–og pop-metodene vises akkurat som vi forventer (lines13-32). Vi kan bruke vår push-metode for å lage en tilpasset initializer med noen variadiske verdier (linjer 7-11). I tillegg kan vi sjekke for en tom stabel ved å sjekke om vår rootNode har en verdi (linjer 34-36) og har en grunnleggende utskriftsmetode som iterates gjennom vår liste så lenge den er i stand til å få tilgang til noder gjennom neste eiendom (linjer 38-44).

en grunnleggende test av vår stabelfunksjonalitet ser slik ut:

Å Vite hvordan man implementerer en stabel er en ting, men enda viktigere er å gjenkjenne situasjoner som en stabel passer godt til. I denne neste delen vil vi se på tre slike tilfeller.

Bruk Sak 1: Omvendt Rekkefølge

fordi rekkefølgen på en stabel er fast, kan omvendt rekkefølge oppnås veldig enkelt ved å poppe elementer av en stabel og umiddelbart på en annen. Ingen rote rundt med bytte indekser!

Bruk Sak 2: Testing Symmetri

En annen god bruk sak for stabler er testing symmetri. I eksemplet nedenfor tester vi en rekke braketter for å sikre at hver lukkebrakett er riktig motstykke til en tidligere åpningsbrakett.

vi starter med å sjekke at tegntallet er delbart med to som et oddetall tegn ville umiddelbart ved asymmetrisk (linje 6). Deretter sjekker vi at vi har gyldig inngang ved å definere et tegnsett med ulovlige tegn og deretter sjekke at vår inngangsstreng har et nullområde av ulovlige tegn (linjer 7-8). For å sjekke at våre lukke-og åpningsbraketter er en kamp, legger vi dem inn i en ordbok som nøkkelverdipar (linje 10). I andre situasjoner kan du kanskje beregne den inverse verdien uten å måtte lagre par i en ordbok. Da har vi vår stabel (linje 11). Formålet med vår stabel i dette tilfellet er å lagre åpningsbraketter. Som vi iterere Gjennom Vår Streng kan vi sjekke om vår karakter er en åpning brakett ved å teste om det er en nøkkel i vår ordbok. Hvis det er, skyver vi det på stakken vår. Når vi finner vår første lukkede brakett, vet vi at vi jobber gjennom den andre halvdelen av mønsteret vårt, så vi setter vår førsthalvboolske til falsk (linje 12). Hvis vi finner flere åpningsbraketter etter dette punktet, kan vi sjekke boolsk og indikere en mislykket test. For hver lukkebrakett spretter vi av den siste åpningsbraketten og kontrollerer om de er et riktig nøkkelverdipar. Igjen trenger vi bare å iterere gjennom strengen en gang, så vi får mye verdi ut av en lineær algoritme.

Use Case 3: Angre Kommandoer

Til Slutt vil Vi bruke en stabel sammen med kommandomønsteret for å lage en angrehistorikk. For å starte, la oss ta en titt på et enkelt bankkontoobjekt. Den har en balanse og en overtrekksgrense og noen enkle metoder for innskudd og uttak av midler:

I Stedet for å ringe innskudds-og uttaksmetodene direkte, kan vi lagre relevant informasjon i en kommando. I koden nedenfor angir vi hva slags handling vi vil utføre med en enum-eiendom (innskudd eller uttak) og et beløp . Vi lagrer også en boolsk for å indikere om kommandoen kunne utføres (linjer 4-11). Legg merke til at hvis uttaksforespørselen overskrider overtrekksgrensen, vil ingenting skje med bankkontoen og den vellykkede boolske vil forbli falsk, ellers vil den bli sann når kommandoen er fullført (linjene 18-26). Vi har to metoder for å ringe eller angre kommandoen, hver tar en bankkonto som et argument (linjer 18 & 28). Disse metodene tar bankkontoen og kaller sine instansmetoder som vi så i forrige utdrag.

Når vi går tilbake til bankkontoen, kan vi nå introdusere vår commandStack-eiendom, som er initialisert med Vår BankAccountType (linje 47). Vi markerer våre innskudds-og uttaksmetoder som fileprivate, slik at de kun kan nås av Vår BankAccountCommand (linjer 62 & 66). Nå har vi to eksponerte metoder: prosess (kommando:) og undoLastCommand (). Den første aksepterer en kommando som inngang, utfører den med bankkontoen som inngang, og skyver deretter kommandoen på stakken. I mellomtiden undoLastCommand-metoden, popper den siste kommandoen av stakken og utfører en angre (linjer 51-60).

dette er et veldig enkelt mønster, og en som er veldig kraftig. De mulige programmene er uendelige og gir en tilfredsstillende brukeropplevelse.

og nå la oss se mønsteret i aksjon:

Wrap Up

i denne artikkelen utforsket vi konseptet med en stabel og LIFO-oppførsel. Vi implementerte vår egen stabel ved hjelp av en dobbeltkoblet liste og demonstrerte hvordan den allokerer og deallokerer minne som størrelsen på stabelen endres. Vi så også på tre vanlige brukssaker for stabler: reversering, testing symmetri og angre. Hver av disse tre situasjonene kommer opp utallige ganger i virkelige prosjekter. Jeg håper at du vil tenke på en stabel som en passende struktur for å håndtere disse behovene. Som alltid, takk for at du leser!

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.

More: