Föreläsning 2 Datastrukturer Abstrakta datastrukturer Stack

Slides:



Advertisements
Liknande presentationer
© Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, 2004 Datastrukturer och algoritmer Föreläsning 4.
Advertisements

Algoritmer och data strukturer -Länkade listor
Föreläsning 3 Lista Array/länkad lista Lista implementerad som länkad lista Inlämningsuppgifter.
© Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, 2003 Datastrukturer och algoritmer Föreläsning 4.
#include void fun(char s[]) { int i=-1; while(s[++i]!=0) { if('a'
Arrays Indicerade variabler.
C-programmering ID120V William Sandqvist Länkad lista
Föreläsning 10 Länkade lista Stack och Kö Att arbeta med listor
Sid 1 CD5250 OOP med C++ Daniel Flemström MDH/IDT CD5250 OOP med C++
Föreläsning 4 Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö.
Föreläsning 5 Träd Binära träd Binärt sökträd som ADT Implementering av binärt sökträd Travestera binärt sökträd Sökning Insättning/borttagning.
Deklarera en struct som kan användas för att representera en rät linje Använd den I main för att deklarera en variabel som du initierar så att den representerar.
William Sandqvist C:s minnesmodell.
Rör vi oss? Det beror på vad vi jämför oss med.
Riktade listor i C och Java Lösning till gruppövning 1.
Anders Sjögren Bitfält exempel Nu kommer ett förbättrat program. Det är funktions- uppdelat och kan lägga till poster som lagras på fil.
William Sandqvist C-programmering ID120V Stack och Kö William Sandqvist
För utveckling av verksamhet, produkter och livskvalitet. Stack och Kö - Implementering - Tilllämpningar.
Datastrukturer och algoritmer
Stack och Kö -Implementering -Tilllämpningar -- Kapitel 16, 11.
Köer -- Kapitel 16. Principen med en kö Köer är FIFO datastrukturer  First In – First Out  enqueue() Lägg till data i kön (först)  dequeue() Hämta.
ITM1 Kapitel 8 Datastrukturer Grundläggande datavetenskap, 4p Utgående från boken Computer Science av: J. Glenn Brookshear.
TILLÄMPAD DATALOGI (TILDA) Övningsgrupp 2 Marcus Hjelm
TILLÄMPAD DATALOGI (TILDA) Övning 1 Marcus Hjelm
1 Objektorienterad programmering för ingenjörer, VT04 Kort repetition av C-programmering och nyttiga verktyg. Tomas Larsson B439.
Anders Sjögren Data (i primärminnet) som en länkad lista datatypen för varje element i listan är en struktur, post ( struct )
© Anders Broberg, Lena Kallin Westin, 2007 Datastrukturer och algoritmer Föreläsning 4.
Anders Sjögren Minnen, variabler, att lagra i primärminnet forts. Den här bilden känner ni igen sedan tidigare. Vi skall fortsätta att prata variabeltyper.
Hud & hudsjukdomar Fredrik Hieronymus.
Behandlas under 4 kursträffar i mineralmuseet
Administration Distribution Metabolism Exkretion
Kap. 3 Derivator och Integraler
Kapitel 3 Sannolikhet och statistik
KONJUNKTURINSTITUTET
Praktiska grejer Lärare: Erik Ramm-Schmidt Läxorna finns på Wilma
Kapitel 1 Algebra och linjära modeller manada.se.
Kapitel 2 Förändringshastigheter och derivator manada.se.
Behandlas under 4 kursträffar i mineralmuseet mars-april 2017
Sällsynta jordartsmetaller
Men kolla bildspelet vecka 18 först
Välkommen till.
Tularemi.
BYGDSAM Anundsjö Grundsunda BLT Nätra.
Finansiell samordning
Arbetsmarknadsutsikterna hösten 2016
Presentation av verksamhetsplan
TATA31 Linjär algebra Examinator, föreläsare: Ulf Janfalk
Dagens ämnen Determinanten Definition och grundläggande egenskaper
Kap 13 Den keynesianska synen
Föreläsning 8: Exempel och problemlösning
Icke parametriska metoder –
Kapitel 9 frekvensanalys.
Övergripande processplan
Måluppfyllelse resultat - genrep Nässjö ( )
Effektutvärdering av ROT-reformen Marcus Jernström
Årsmöte Funbo IF Vargspåret 27 mars 2018 VÄLKOMNA !
Beteendevetare med inriktning religion och kultur
Närsjukvårdsmöte
Förstudie Otålighet Läsa redan beslutade Intervjua aktiva och berörda
Evidensbaserade miljöanalyser
Varmt välkommen!.
Vad är bostad först? En beprövad modell mot hemlöshet Har bevisat goda effekter jämfört med t.ex. boendetrappor Skapad i New York av psykologen Sam.
KURSVAL HT19
Massa Produktion och leveranser
för dig som rapporterar resultat
Hur vi arbetar för att nå ut med små medel
Så vårdar du ditt sjuka barn
Nya perspektiv? Välkommen till SV!
Rättsombuds- verksamheten
Handhavandeguide-Ladok Attestera resultat
Presentationens avskrift:

Föreläsning 2 Datastrukturer Abstrakta datastrukturer Stack Stack implementerad med array Länkad lista Stack implementerad med länkad lista Inlämningsuppgifter

Datastrukturer En datastruktur är en struktur som organiserar data Ett elementärt exempel är en array i C Val av datastruktur ska göras så att vi effektivt kan lagra, organisera och processa data För vissa problem är val av rätt datastruktur mer än halva lösningen!

Abstrakta datastrukturer Exempel på datastrukturer: stack, kö, lista, prioritetskö, träd, graf (-ADT) array, länkad lista, heap (-implementeringar) En abstrakta datastruktur (ADT-abstract data type) definieras via operationerna som kan utföras utan att diskutera implementation En stack kan definieras via push (som lägger ett element överst i stacken) och pop (som returnerar översta elementet i stacken) En stack kan implementeras med en array eller en länkad lista Det finns flera möjliga definitioner av tex en stack-ADT Uppdelningen är något rörig för att uttrycka sig milt, en prioritetskö kan implementeras med en heap som är ett träd och kan implementeras med en array eller en länkad lista. Man kan också ange en ADT för en array även om det är ovanligt

Stack (ADT) En stack fungerar som en hög. Man fyller på överst och man tar bort överst. LIFO-Last In First Out. push(element) - lägger element överst i stacken pop() – avlägsnar och returnerar översta elementet (ibland pull) Möjliga operationer: initStack() / freeStack(stack) isEmpty() – returnerar true om stacken är tom isFull() - returnerar true om stacken är full peek() - returnerar översta elementet (utan att avlägsna det)

Stack implementerad med array stack.c: #include "stack.h" #define SIZE 30 static char stack[SIZE]; static int nrElements = 0; void push(char c){ stack[nrElements]=c; nrElements++; } char pop(){ return stack[--nrElements]; int isEmpty(){ return nrElements == 0; stack.h: void push(char c); char pop(); int isEmpty(); main.c: #include <stdio.h> #include <stdlib.h> #include "stack.h" int main(){ push('h'); push('e'); push('j'); while(!isEmpty()) printf("%c,",pop()); return 0; } Saknar skydd! Om vi behöver 2 stackar?

Flera stackar stackArray.c: #include <stdlib.h> #include <assert.h> #include "stackArray.h" Stack* initStack(){ Stack *sp = (Stack*)malloc(sizeof(Stack)); sp->nrElements=0; return sp; } void push(Stack *sp, int element){ assert(sp->nrElements<MAXSTACK); sp->array[sp->nrElements]=element; ++(sp->nrElements); int pop(Stack *sp){ assert(!isEmpty(sp)); --(sp->nrElements); return sp->array[sp->nrElements]; … stackArray.h: #define MAXSTACK 20 typedef struct{ int nrElements; int array[MAXSTACK]; } Stack; Stack* initStack(); void push(Stack *sp, int element); int pop(Stack *sp); … main.c: Stack *s1 = initStack(); Stack *s2 = initStack(); int i; for(i=0;i<10;i++) push(s1,i); for(i=0;i<10;i++) push(s2,pop(s1)); for(i=0;i<10;i++) printf("Element: %d \n",pop(s2)); freeStack(s1); freeStack(s2);

Länkad lista (enkellänkad) En länkad lista är en datastruktur där varje element ligger i en nod som håller reda på nästa nod. Det enda man behöver är den första noden. Fördelarna med denna struktur jämfört med ett fält är att den kan växa dynamiskt och att det är effektivt att stoppa in eller ta ut element mitt i. Man behöver inte flytta massor med element utan bara ändra länkarna. nämn dubbellänkad första Data1 Data2 Data3 Data4

Lägga till data på godtycklig plats: första Data1 Data2 Data3 Data4 Ny data Ta bort data: första Data1 Data2 Data3 Data4

Stack implementerad som länkad lista main.c: #include <stdio.h> #include "stackLink.h" int main(){ int i; for(i=0;i<10;i++){ push('a'+i); } while(!isEmpty()) printf("%c\n",pop()); return 0; stackLink.c: #include <stdlib.h> #include "stackLink.h" typedef struct node node; node *top=NULL; struct node{ char element; node *next; }; void push(char c){ node *newNode = (node *)malloc(sizeof(node)); newNode ->element = c; newNode ->next=top; top= newNode; } Ansvaret är lagt i main (hos användaren) stackLink.h: void push(char c); char pop(); int isEmpty();

stack.c: … char pop(){ char c = top->element; node *newNode =top; top = top->next; free(newNode); return c; } int isEmpty(){ return top==NULL;

Flera stackar stackLink.c: #include <stdlib.h> #include <assert.h> #include "stackLink.h" Stack* initStack(){ Stack *sp = (Stack*)malloc(sizeof(Stack)); sp->top=NULL; return sp; } void push(Stack *sp, int element){ Node *newNode = (Node*)malloc(sizeof(Node)); newNode->element=element; newNode->next=sp->top; sp->top=newNode; int pop(Stack *sp){ assert(!isEmpty(sp)); int element = sp->top->element; Node *temp = sp->top; sp->top = sp->top->next; free(temp); return element; … stackLink.h: typedef struct node Node; struct node{ int element; Node *next; }; typedef struct{ Node *top; }Stack; Stack* initStack(); void push(Stack *sp, int element); int pop(Stack *sp); … main.c: Stack *s1 = initStack(); Stack *s2 = initStack(); int i; for(i=0;i<10;i++) push(s1,i); for(i=0;i<10;i++) push(s2,pop(s1)); for(i=0;i<10;i++) printf("Element: %d \n",pop(s2)); freeStack(s1); freeStack(s2); Påminn om freestack måste tömma först!

Inlämningsuppgifter Följande uppgifter redovisas senast måndag den 28 januari och kan inte redovisas senare: 2A, 2B, 2.2, 2.C Dessa uppgifter bör göras nu för att ni ska kunna följa kursen på ett bra sätt. Övriga kan ni göra vid tillfälle för högre betyg.

Uppgifter ej i boken 2.A Implementera en stack för decimaltal mha en array. Använd separata filer: stack.c, stack.h, main.c. Stacken ska ha funktionerna push, pop, peek, isEmpty, isFull, initStack och freeStack. Den ska allokera minne för stacken dynamiskt (dvs som på föreläsningen, ejdynamisk storlek på arrayen). Skriv ett eget testprogram i main som testar att allt verkar fungera. Se till att du lär dig att kompilera projekt med flera filer i codeblocks. (2p) 2.B Implementera en stack för strängar mha länkade listor. Använd separata filer. Skriv ett program i main som läser in 10 ord från användaren och lagrar dessa i stacken. Sedan ska programmet skriva ut alla ord i stacken. TIPS: Skapa en struct som innehåller en sträng (char-array). (2p) 2.C Gör exempel 2.1 i boken. (3p)