Länkade listor, stackar och köer

Relevanta dokument
DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Abstrakta datatyper Laboration 2 GruDat, DD1344

Övning 1. Abstrakta datatyper. 1. Stacken. class Stack: """A representation of a last-in-first-out (LIFO) stack of objects."""

Python. Vi har ofta behov av att behandla datastrukturer på ett enhetligt sätt så att vi kan göra samma sak i flera olika program.

Övning 1 - Abstrakta datatyper

Datastrukturer och algoritmer

Länkade strukturer. (del 2)

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Grundläggande datalogi - Övning 2

Föreläsning 13 och 14: Binära träd

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

ADS : STACK ADT: STACK. Stack och Kö -Implementering - Tilllämpningar. Oftast förekommande metoder i Stack. TopOfStack

Datastrukturer och algoritmer. Föreläsning 4 Test, Stack och Kö

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

Sätt att skriva ut binärträd

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Stackar, köer, iteratorer och paket

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Föreläsning 11. ADT:er och datastrukturer

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Övning 2. (Länkade) Listor, noder

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Föreläsning 8: Exempel och problemlösning

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Grundläggande datalogi - Övning 3

Datastrukturer. föreläsning 3. Stacks 1

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Datastrukturer och algoritmer

Grundläggande datalogi - Övning 4

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Föreläsning Datastrukturer (DAT036)

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

Lösningsförslag till exempeltenta 2

Föreläsning 4 Innehåll

Grundläggande datalogi - Övning 1

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

TDP002 Imperativ programmering. Laborationsmaterial emacs python-mode

Föreläsning 3. Stack

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Föreläsning 3. Stack

Föreläsning 2 Datastrukturer (DAT037)

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Laboration: Whitebox- och blackboxtesting

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Introduktion till algoritmer - Lektion 3 Matematikgymnasiet, Läsåret Lektion 3

Lektion 2: Sökagenter. Robin Keskisärkkä

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

Mer grafik. Jan Erik Moström

Stack, specifikation. Stack och Kö. Y s t M A p. Stack. <== > Y s t M A p <== > Prioritetskö

Övning 1. Abstrakta datatyper. 1. Stacken. class Stack: """A representation of a last-in-first-out (LIFO) stack of objects."""

Tentamen i Introduktion till programmering

Föreläsning 3 Datastrukturer (DAT037)

Tommy Färnqvist, IDA, Linköpings universitet

TANA17 Matematiska beräkningar med MATLAB för M, DPU. Fredrik Berntsson, Linköpings Universitet. 8 december 2015 Sida 1 / 22

TENTAMEN: Objektorienterad programutveckling. Läs detta! Skriv ditt namn och personnummer på varje blad (så att vi inte slarvar bort dem).

Övning 1. Abstrakta datatyper. 1. Stacken

Ordnad lista. Listor... Ordnad lista... Ordnad lista typer

Kurskod D0010E Datum Skrivtid 5tim

Tentamen kl Uppgift 4. Uppgift 5

Föreläsning 3 Datastrukturer (DAT037)

Abstrakta datastrukturer

Tentamen i Algoritmer & Datastrukturer i Java

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 5 Erik Nilsson, Institutionen för Datavetenskap, LiU

Övning 3. Problemträd, breddenförst, djupetförst, hashning. Skriv ett program som läser personers namn och födelsedag från fil.

Programmering i C++ EDA623 Dynamiska datastrukturer. EDA623 (Föreläsning 11) HT / 31

729G04 Programmering och diskret matematik. Föreläsning 7

Introduktion till programmering SMD180. Föreläsning 8: Listor

Ordlistor, filhantering och ut på webben. Linda Mannila

Tentamen Datastrukturer (DAT036)

Tentamen. Programmeringsmetodik, KV: Java och OOP. 17 januari 2002

Tentamen i Algoritmer & Datastrukturer i Java

Övning 6. Ali Tofigh 24 Oktober, 2006

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Några svar till TDDC70/91 Datastrukturer och algoritmer

Föreläsning 8 Programmeringsteknik och Matlab DD1312. Klassmetod. Egen modul

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Planering av ett större program, del 2 - for och listor. Linda Mannila

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Länkade strukturer, parametriserade typer och undantag

TENTAMEN: Objektorienterad programutveckling, fk. Läs detta! Börja varje hel uppgift på ett nytt blad. Skriv inte i tesen.

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Föreläsning 9 Innehåll

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser

Uppgift 1 ( Betyg 3 uppgift )

Programmering II (ID1019) :00-12:00

Grundläggande Datalogi

Datalogi för E Övning 3

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

DD1321, Tentamen i tillämpad programmering och datalogi Lördagen den 18 dexember 2010 kl 13 18

TDDC30 Programmering i Java, datastrukturer och algoritmer

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Transkript:

Länkade listor, stackar och köer I fortsättningen ska vi ta upp några olika abstrakta datatyper. De kan ses som enkla verktyg i en verktygslåda som ska göra det lättare att programmera. Några av dessa datatyper är länkade listor, stackar och köer. De här begreppen dyker upp lite varstans inom datalogi, programmering och operativsystem, så det kan löna sig att vara säker på grunderna. En länkad lista (i sin enklaste version) består av noder som var och en pekar på nästa nod i listan. Varje nod har ett innehåll (som i boken kallas cargo ) och en referens till nästa nod i listan. Vi kan börja med att skriva en klass som beskriver en nod i en länkad lista.

En nodklass (Det här exemplet kommer ur boken.) class Node: def init (self, cargo=none, nextnode=none): self.cargo=cargo self.nextnode=nextnode def str (self): return str(self.cargo) Nod-objekt kan nu användas för att skapa listor. Nedanstående kommandon skapar tre noder och kopplar ihop dem med varandra. >>> from Node import * >>> node1=node(1) >>> node2=node(2) >>> node3=node(3) >>> node1.nextnode=node2 >>> node2.nextnode=node3

Skriva ut lista och ta bort noder Så här kan vi skriva ut en lista: def printlist(node): while node: print node, node=node.nextnode print Man stegar sig alltså fram i listan via nextnode-pekarna. Den första noden är ett slags referens till hela listan; via den kan man nå alla andra noder genom att stega sig fram. Vi har sett hur man lägger till nya noder i en lista. Men hur tar man bort noder? def removesecond(node): if list==none: return first=list second=list.nextnode # gör så att första noden pekar på den tredje first.nextnode=second.nextnode # låt andra noden peka ut i intet second.nextnode=none return second

Abstrakta datatyper: stackar Stack betyder ju ungefär hög eller trave på svenska och den här datatypen tänker man sig ungefär som en trave med tallrikar, där den tallrik man senast lade dit är den första man plockar ut. Man säger att det är en LIFO (last in, first out)-struktur. Stackar brukar ha åtminstone två metoder, push() och pop(). push() lägger något (ett objekt, en sträng, ett tal...) på stacken. pop() plockar ut det som ligger överst - dvs. det som lades dit senast. Det kan också vara användbart att ha en metod isempty() för att kolla om stacken är tom och en metod för att skriva ut stackens innehåll. I Python är det ganska lätt att skriva en stack-klass; det finns redan bra funktioner för att lägga till och ta bort objekt så man behöver inte göra så mycket själv. I boken (kap. 18) finns ett exempel på en stack-klass. Man kan också helt enkelt låta Stack vara en klass som ärver från list.

En stack-klass import sys class Stack(list): def push(self,x): self.append(x) # pop() finns redan för list i Python! def isempty(self): return len(self)==0 def write(self): for i in self: print i, Funktionen append() lägger till ett objekt i slutet av en lista, så vi använder den som push() i vår stack-klass. pop() finns redan i Python, så den behöver vi inte ens skriva! Vi lägger till några metoder för att kolla om stacken är tom och för att skriva ut den.

Test av stack-klassen Nu kan vi testa om stacken fungerar som den ska. När man plockar ut objekt man lagt in ska de komma ut i omvänd ordning. Vi testar med ett par tal och sedan ett helt ord. from Stack import * s=stack() s.push(3) s.push(9) s.push(13) s.push(14) print s.pop() print s.pop() # Vända på en sträng t=stack() ord = "palindrom" for a in ord: t.push(a) while not t.isempty(): sys.stdout.write ( t.pop() ) print Utskriften blir: 14 13 mordnilap

Stack implementerad med länkad lista Här är ett exempel på hur man kan göra en stack med länkade listor. Det antas att Node-klassen vi gjorde innan finns. class Stack: top=none def init (self,num): # Här måste man lägga något i stacken då den skapas # Hur skulle man skriva annars? self.top=node(num) self.length=1 def push(self,num): self.top=node(num,self.top) self.length+=1 def pop(self): if self.length==0: print"empty stack" return else: v=self.top.cargo self.top=self.top.nextnode self.length-=1 return v

Köer En kö är ungefär som en stack, men när man plockar ut saker ur den får man den första saken som stoppades in, inte den sista som i stackar. Precis som i en riktig kö alltså - den som ställde sig först kommer (förhoppningsvis) fram först. Köernas metoder för att lägga in och ta ut objekt heter ibland enqueue() och dequeue(), eller get() och put() - i boken har de valt namnen insert() och remove(). Boken (kap. 19) innehåller en kö som är gjord (dvs implementerad) med hjälp av länkade listor. Det kan vara lärorikt att titta på det exemplet och förstå hur det funkar. Men vi kan köra på samma modell som tidigare och låta vår kö ärva av list. class Queue(list): def put(self,x): self.append(x) def get(self): return self.pop(0) def isempty(self): return len(self)==0 def write(self): for i in self: print i, Den här klassen är nästan likadan som Stack, förutom att vi varit tvungna att skriva en liten metod för att plocka ut element.

Test av köklass Vi testar köklassen för säkerhets skull: from Queue import * s=queue() s.put(3) s.put(7) s.put(13) print s.get() print s.get() Resultatet blir som väntat: 3 7

Köklass med länkade listor class Queue: front=none back=none def init (self,num): # Kräver att man lägger något i kön när den skapas self.front=self.back=node(num) self.length=1 def put(self,num): if self.length==0: self.front=self.back=node(num) self.length=1 else: n=node(num) self.back.nextnode=n self.back=n self.length+=1 def get(self): if self.length==0: print"empty queue" return else: v=self.front.cargo self.front=self.front.nextnode self.length-=1 return v

Att vända på en kö Hur vänder man på en kö? Om man tar ut elementen ett efter ett och lägger dem i en annan kö, så hamnar de ju i samma ordning igen. Om vi vill vända på kön behöver vi en stack. q=queue() s=stack() q.put(2) q.put(5) q.put(10) print "Kön före vändning" q.write() while not q.isempty(): s.push(q.get()) while not s.isempty(): q.put(s.pop()) print "Kön efter vändning" q.write() Resultatet blir: Kön före vändning 2 5 10 Kön efter vändning 10 5 2