Stack. En enkel, lineær datastruktur

Like dokumenter
Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Binære trær: Noen algoritmer og anvendelser

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Repetisjon: Binære. Dagens plan: Rød-svarte trær. Oppgave (N + 1)!

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

Lenkelister, iteratorer, indre klasser. Repetisjonskurs våren 2018 kristijb

Liste som abstrakt konsept/datatype

Inf 1020 Algoritmer og datastrukturer

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

Et eksempel: Åtterspillet

Algoritmer og Datastrukturer

Et eksempel: Åtterspillet

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

Dagens tema. INF Algoritmer og datastrukturer. Binærtrær. Generelle trær

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

Heap* En heap er et komplett binært tre: En heap er også et monotont binært tre:

Løsningsforslag for Obligatorisk Oppgave 3. Algoritmer og Datastrukturer ITF20006

Binær heap. En heap er et komplett binært tre:

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

Heap og prioritetskø. Marjory the Trash Heap fra Fraggle Rock

Ny/utsatt EKSAMEN. Dato: 5. januar 2018 Eksamenstid: 09:00 13:00

Definisjon av binært søketre

Datastrukturer. Algoritmer og datastrukturer. Øvingsforelesning 2

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

Definisjon: Et sortert tre

PG4200 Algoritmer og datastrukturer Forelesning 7

Oppgave 1. Sekvenser (20%)

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

Algoritmer og Datastrukturer

EKSAMEN. Algoritmer og datastrukturer. Eksamensoppgaven: Oppgavesettet består av 11 sider inklusiv vedlegg og denne forsiden.

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

EKSAMEN Løsningsforslag. med forbehold om bugs :-)

Løsnings forslag i java In115, Våren 1999

Løsnings forslag i java In115, Våren 1998

UNIVERSITETET I OSLO

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Datastrukturer. Stakker (Stacks) Hva er en datastruktur? Fordeler / Ulemper. Generelt om Datastrukturer. Stakker (Stacks) Elementære Datastrukturer

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

Dagens tema INF1010 INF1010 INF1010 INF1010

Binære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID:

Programmeringsspråket C Del 3

Algoritmer og Datastrukturer

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn

UNIVERSITETET I OSLO

Pensum Hovedtanker Selvmodifiserende Overflyt Veien videre Eksamen. Oppsummering

Backtracking som løsningsmetode

Backtracking som løsningsmetode

Fra Kap.10 Binære søketre (BS-tre) Sist oppdatert Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes

Norsk informatikkolympiade runde

Innlevering 2b i INF2810, vår 2017

Den siste dagen. Pensumoversikt Hovedtanker i kurset Selvmodifiserende kode Overflyt Veien videre... Eksamen

En oppsummering (og litt som står igjen)

Rekursiv programmering

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

Søkeproblemet. Gitt en datastruktur med n elementer: Finnes et bestemt element (eller en bestemt verdi) x lagret i datastrukturen eller ikke?

TOD063 Datastrukturer og algoritmer

Rekursiv programmering

Rekursjon. Binærsøk. Hanois tårn.

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Enkle datastrukturer. Lars Greger Nordland Hagen. Introduksjon til øvingsopplegget og gjennomgang av python

2 Om statiske variable/konstanter og statiske metoder.

EKSAMEN. Emne: Algoritmer og datastrukturer

Algoritmer og Datastrukturer

UNIVERSITETET I OSLO

Datastrukturer for rask søking

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Litt om Javas class-filer og byte-kode

Operasjoner på lenkede lister (enkeltlenket) Eksempel på en lenket liste: personliste. INF januar 2010 (uke 3) 2

En implementasjon av binærtre. Dagens tema. Klassestruktur hovedstruktur abstract class BTnode {}

Algoritmer og Datastrukturer

2 Om statiske variable/konstanter og statiske metoder.

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

INF1400 Kap4rest Kombinatorisk Logikk

Algoritmer og Datastrukturer IAI 21899

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2017

Studieaktiviteter i INF1010

TDT4100 Objektorientert programmering

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013

Dagens tema. Mer MIPS maskinkode. Maske-operasjoner Skift-operasjoner Lesing og skriving Pseudo-instruksjoner Mer om funksjonskall Registeroversikt

Dagens forelesning. INF1010 Datastrukturer Lister og køer Pekerkjedelister Øvelser. Innhold i dette lysarksettet

Obligatorisk oppgave 5: Labyrint

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

Transkript:

Stack En enkel, lineær datastruktur

Hva er en stack? En datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist Et nytt element legges alltid på toppen av stakken Skal vi ta ut et element, tar vi alltid det øverste Sammenlikning: Stabel med tallerkener Kalles også en LIFO-kø (Last In, First Out)

Innsetting og fjerning av data: push og pop

Operasjonene på en stack push: legge til et element øverst på stacken pop: fjerne øverste element top: se på/finne øverste element (aka peek) isempty: sjekk om stacken har null elementer size: gir antall elementer som er lagret på stacken

Anvendelser av stack Snu rekkefølger "undo i tekstbehandlere (drop-out stack) Lesing og beregning av regneuttrykk I kompilatorer f.eks. syntakssjekking og parsing av koden I operativ- og runtimesystemer, for å holde rede på funksjonskall (Alan Turing, 1946) og bruken av memory Simulering av rekursjon

Grensesnitt for en stack i Java public interface Stack<E> { // Legge et nytt element på stacken public void push(e element); //Fjerne og returnere øverste element på stakken public E pop(); //Returnerer øverste element uten å fjerne det public E peek(); // eller public E top(); // Antall elementer på stacken public int size(); } // Sjekker om stacken er tom public boolean isempty();

Anvendelse: Snu rekkefølge av input 1. For hvert tegn i input: 1.1 Push tegnet på en stack 2. Inntil stacken er tom: 2.1 Pop stack og skriv ut tegnet Java-kode

Stack implementert med array Lagrer elementene på stacken i en array med objekter, som initielt er tom Holder rede på toppen av stacken med en enkel teller som er indeks til neste ledige plass i arrayen Teller oppdateres for hver push/pop Stacken er tom når teller er lik 0 Dynamisk stack, øker lengden på array når den er full av elementer Se implementasjon i læreboka

Stack implementert som lenket liste Et stack-objekt med referanse/peker til noden på toppen av stacken, og en teller med antall elementer Noder med: Referanse/peker til neste element på stacken Referanse/peker til objekt som inneholder dataene Se avsnitt 4.4 i læreboka og demo i Javakoden som følger med læreboka

Anvendelse: Parantessjekking Kompilatorer bruker stakker blant annet til å kontrollere at paranteser kommer riktig i forhold til hverandre, d.v.s. at symbolene balanserer. For hver { må det finnes en }, for hver [ må det finnes en ], og så videre. Opptelling av antall åpningsparanteser og antall sluttparanteser er utilstrekkelig, fordi parantesene også må være riktig plassert i forhold til hverandre. Eksempel: Sekvensen [()] er riktig, mens sekvensen [(]) er feil.

Algoritme for parantessjekking 1. Lag en tom stakk 2. Les ett og ett tegn inntil slutt på input 2.1 Hvis lest tegn er en startparantes, push det på stakken 2.2 Ellers, hvis lest tegn er en sluttparantes: 2.2.1 Hvis stakken er tom, rapporter feil (mangler en startparantes) 2.2.2 Ellers, pop stakken og sjekk om symbolet som poppes er korresponderende startparantes Hvis ikke, rapporter feil (feil type parantes) 3. Hvis stakken ikke er tom når alle tegn er lest, rapporter feil (mangler minst én sluttparantes) Java-kode

Anvendelse: En postfix-maskin Vi er vant til å skrive regneuttrykk med infix notasjon -- operatorer mellom operandene: a / b a + b * c - d (a + b) * ( c - d) Infix krever presedensregler og paranteser: Beregnes fra venstre mot høyre Uttrykk inne i paranteser beregnes først Multiplikasjon og divisjon utføres før addisjon og subtraksjon

Postfix notasjon I postfix (eller omvendt polsk) notasjon skrives en (binær) operator rett etter de to operandene som den skal virke på: a b / a b c * + d - a b + c d - * Trenger ingen presedensregler eller paranteser Enkelt å beregne maskinelt/mekanisk med bruk av en stack Steinalderprogrammering brukte postfix

Noen flere eksempler Infix Postfix 1 + 9 1 9 + 1 + 4 * 2 1 4 2 * + 1 + 2 * 3 + 4 * 5 1 2 3 *+ 4 5 * +

Beregning av postfix regneuttrykk 1. Lag en ny stack S som kan lagre operander 2. Lag to referanser venstre og høyre til operander 3. For alle tegn T i i uttrykket: 3.1 Hvis T er en operand: S.push(T) 3.2 Ellers, hvis T er en operator 3.2.1 Sett høyre til S.pop() 3.2.2 Sett venstre til S.pop() 3.2.3 S.push(eval(venstre, T, høyre)) 4. Returner S.pop() eval(1,+,2) er vanlig infix evaluering: 1+2=3 Se Java-implementasjonen fra læreboka

Oversettelse fra infix til postfix Viktig problem å løse: Mennesker forstår best infix, maskinell beregning lettest i postfix Oversettelse (kompilering) av infix til postfix er grunnleggende for å utvikle gode programmerings-språk FORTRAN 1 FORmula TRANslator IBM ca. 1955 Første kommersielle programmeringsspråk som tillot skriving av regneuttrykk i infix Strategi for oversettelse: Skriver operander som leses fra infix utrykk direkte ut til postfix Lagrer operatorer på stack, skriver ut en operator rett etter at begge operandene den skal virke på er skrevet ut

Oversettelse med en operatorstack Algoritme for oversettelse av infix-uttrykk til postfix, uten paranteser og kun med operatorene +-*/ : 1. Lag en ny stack S som kan lagre operatorer 2. For alle tegn T i uttrykket: 2.1. Hvis T er en operand: Skriv ut T 2.2. Ellers, hvis T er en operator: 2.2.1. Så lenge T sin rang er lavere eller lik S.top() 2.2.1.1 Skriv ut S.pop() 2.2.2. S.push(T) 3. Pop og skriv ut alle gjenværende operatorer på S

Eksempel: Finne vei gjennom en labyrint Labyrint: 2-dimensjonal tabell med 1'er (vei) og 0'ere (hindring) Starter i øvre venstre hjørne, vil til nedre høyre hjørne private int [][] grid = { {1,1,1,0,1,1,0,0,0,1,1,1,1}, {1,0,0,1,1,0,1,1,1,1,0,0,1}, {1,1,1,1,1,0,1,0,1,0,1,0,0}, {0,0,0,0,1,1,1,0,1,0,1,1,1}, {1,1,1,0,1,1,1,0,1,0,1,1,1}, {1,0,1,0,0,0,0,1,1,1,0,0,1}, {1,0,1,1,1,1,1,1,0,1,1,1,1}, {1,0,0,0,0,0,0,0,0,0,0,0,0}, {1,1,1,1,1,1,1,1,1,1,1,1,1} };

Strategi for å finne vei Prøver etter tur alle mulig veier videre fra nåværende posisjon Følger alltid en mulig vei så langt som mulig Hvis vi kommer til en blindvei, returnererer vi til foregående posisjoner i motsatt rekkefølge, og prøver en av de andre veiene videre derfra Besøkte posisjoner må merkes, slik at vi unngår å gå i ring

Implementasjon: Labyrinten Bruker en stack til i hvert steg å lagre alle lovlige steg videre fra nåværende posisjon Lovlig steg: Går ikke ut av labyrinten Går ikke til en blokkert rute Går ikke til en rute vi har oppsøkt fra før Starter med å pushe (0, 0) på stacken Går videre til øverste posisjon på stacken inntil vi er fremme i nedre høyre hjørne eller stacken tom Se Java-koden fra læreboka