Presentation laddar. Vänta.

Presentation laddar. Vänta.

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

Liknande presentationer


En presentation över ämnet: "Föreläsning 2 Datastrukturer Abstrakta datastrukturer Stack Stack implementerad med array Länkad lista Stack implementerad med länkad lista Inlämningsuppgifter."— Presentationens avskrift:

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

2 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!

3 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

4 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)

5 Stack implementerad med array stack.h : void push(char c); char pop(); int isEmpty(); stack.h : void push(char c); char pop(); int isEmpty(); 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.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; } main.c : #include #include #include "stack.h" int main(){ push('h'); push('e'); push('j'); while(!isEmpty()) printf("%c,",pop()); return 0; } main.c : #include #include #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?

6 Flera stackar stackArray.c : #include #include #include "stackArray.h" Stack* initStack(){ Stack *sp = (Stack*)malloc(sizeof(Stack)); sp->nrElements=0; return sp; } void push(Stack *sp, int element){ assert(sp->nrElementsarray[sp->nrElements]=element; ++(sp->nrElements); } int pop(Stack *sp){ assert(!isEmpty(sp)); --(sp->nrElements); return sp->array[sp->nrElements]; } … stackArray.c : #include #include #include "stackArray.h" Stack* initStack(){ Stack *sp = (Stack*)malloc(sizeof(Stack)); sp->nrElements=0; return sp; } void push(Stack *sp, int element){ assert(sp->nrElementsarray[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); … 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); 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);

7 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. Data1Data2Data3Data4 första

8 Ny data första Data1Data2Data3Data4 Lägga till data på godtycklig plats: Data1Data2Data3Data4 Ta bort data: första

9 Stack implementerad som länkad lista stackLink.c : #include #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; } stackLink.c : #include #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; } main.c : #include #include "stackLink.h" int main(){ int i; for(i=0;i<10;i++){ push('a'+i); } while(!isEmpty()) printf("%c\n",pop()); return 0; } main.c : #include #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.h : void push(char c); char pop(); int isEmpty(); stackLink.h : void push(char c); char pop(); int isEmpty();

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

11 Flera stackar stackLink.c : #include #include #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.c : #include #include #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); … 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); 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);

12 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.

13 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)


Ladda ner ppt "Föreläsning 2 Datastrukturer Abstrakta datastrukturer Stack Stack implementerad med array Länkad lista Stack implementerad med länkad lista Inlämningsuppgifter."

Liknande presentationer


Google-annonser