Presentation laddar. Vänta.

Presentation laddar. Vänta.

William Sandqvist william@kth.se C-programmering ID120V Stack och Kö william@kth.se William Sandqvist william@kth.se.

Liknande presentationer


En presentation över ämnet: "William Sandqvist william@kth.se C-programmering ID120V Stack och Kö william@kth.se William Sandqvist william@kth.se."— Presentationens avskrift:

1 William Sandqvist william@kth.se
C-programmering ID120V Stack och Kö William Sandqvist

2 William Sandqvist william@kth.se
Data i länkad lista Det är enklast att nå länkade listor från ”ändarna”. Man lägger till eller tar bort element – men man flyttar inte om i listan. Stack William Sandqvist

3 Två sätt att hantera data
Stack och Kö sist in Stack LIFO först ut William Sandqvist

4 Två sätt att hantera data
Stack och Kö först in först ut FIFO William Sandqvist

5 Likna stacken med en stege
Man kan bara kliva på i nedre ändan, push. Man kan bara kliva av i nedre ändan, pop. När någon ny kliver på måste inte alla andra på stegen ta ett kliv uppåt. Det räcker med att skapa en ny plats och ordna pekarna. När någon kliver av behöver inte alla ta ett steg nedåt. Det räcker med att ta bort platsen och ordna pekarna. Push Vi behöver inte flytta elementen i listan – bara ordna pekarna. William Sandqvist

6 William Sandqvist william@kth.se
Stack, exempel Ett exempel på hur man med en länkad lista och funktionerna push() och pop() skapar en datastack ( datastruktur ).  Programmet vänder på teckenordningen i en sträng  Att lagra och vända på ordningen är typiskt för stacken William Sandqvist

7 Datatyper och funktionsprototyp
Det data som vi vill lagra på stacken. Om man konstruerar Push() och Pop() för att ta en struct blir dessa funktioner generella. #include <stdio.h> #include <stdlib.h> typedef struct { int heltalsData; } DataTyp ; typedef struct StackElementTyp { DataTyp d; struct StackElementTyp *next ; } StackElementTyp ; typedef StackElementTyp* BottenPekarTyp ; void Pop( BottenPekarTyp *b, DataTyp *x ); void Push( BottenPekarTyp *b , DataTyp x ) ; int ArTom( BottenPekarTyp b ); void Baklanges( char xString[] ); Nyttolast! William Sandqvist

8 Datatyper och funktionsprototyp
För att kunna lagra som en stack med en länkad lista så måste det finnas en next-pekare. Denna tillfogas av Push() m h a denna struct #include <stdio.h> #include <stdlib.h> typedef struct { int heltalsData; } DataTyp ; typedef struct StackElementTyp { DataTyp d; struct StackElementTyp * next ; } StackElementTyp ; typedef StackElementTyp* BottenPekarTyp ; void Pop( BottenPekarTyp *b, DataTyp *x ); void Push( BottenPekarTyp *b , DataTyp x ) ; int ArTom( BottenPekarTyp b ); void Baklanges( char xString[] ); StackElementTyp NULL Push() William Sandqvist

9 Datatyper och funktionsprototyp
För att tydligt kunna skapa en pekare, handtag, till stacken (botten). OBS pekare! #include <stdio.h> #include <stdlib.h> typedef struct { int heltalsData; } DataTyp ; typedef struct StackElementTyp { DataTyp d; struct StackElementTyp * next ; } StackElementTyp ; typedef StackElementTyp * BottenPekarTyp ; void Pop( BottenPekarTyp *b, DataTyp *x ); void Push( BottenPekarTyp *b , DataTyp x ) ; int ArTom( BottenPekarTyp b ); void Baklanges( char xString[] ); StackElementTyp NULL BottenPekarTyp William Sandqvist

10 Datatyper och funktionsprototyp
#include <stdio.h> #include <stdlib.h> typedef struct { int heltalsData; } DataTyp ; typedef struct StackElementTyp { DataTyp d; struct StackElementTyp * next ; } StackElementTyp ; typedef StackElementTyp * BottenPekarTyp ; void Pop( BottenPekarTyp *b, DataTyp *x ); void Push( BottenPekarTyp *b , DataTyp x ) ; int ArTom( BottenPekarTyp b ); void Baklanges( char xString[] ); För att lägga till, i botten, stackelement på stacken NULL BottenPekarTyp William Sandqvist

11 Bokstäver i omvänd ordning
int main(int argc, char *argv[]) { char strang[21] = {'\0'}; printf("Ge en str\204ng, max 20 tecken: --> "); scanf("%s", strang ); baklanges( strang ); printf ("\nBakl\204nges blir det:\t%s\n", strang ); system("PAUSE"); return 0; } William Sandqvist

12 William Sandqvist william@kth.se
baklanges() void Baklanges( char xString[] ) { int i; DataTyp data; BottenPekarTyp bottenPek = NULL ; for ( i=0 ; xString[i] != '\0' ; ++i ) { data.heltalsData = xString[i]; Push( &bottenPek , data ); } for ( i=0 ; xString[i] != '\0' ; ++i ) { Pop( &bottenPek , &data ); xString[i] = data.heltalsData ; } return; } Fyller på stacken NULL A n d e r s William Sandqvist bottenPek

13 William Sandqvist william@kth.se
Push() NULL Både data in resp data ut Skapar stackelement , data + pekare A n void Push( BottenPekarTyp *b , DataTyp x ) { BottenPekarTyp temp; temp = malloc(sizeof( StackElementTyp )); temp->d = x ; temp->next = *b ; *b = temp ; return; } invärde d utvärde invärde e invärde r utvärde s William Sandqvist bottenPek

14 William Sandqvist william@kth.se
baklanges()- Pop() void Baklanges( char xString[] ) { int i; DataTyp data; BottenPekarTyp bottenPek = NULL ; for ( i=0 ; xString[i] != '\0' ; ++i ) { data.heltalsData = xString[i]; Push( &bottenPek , data ); } for ( i=0 ; xString[i] != '\0' ; ++i ) { Pop( &bottenPek , &data ); xString[i] = data.heltalsData ; } return; } NULL A n d e r s William Sandqvist bottenPek

15 William Sandqvist william@kth.se
Pop() Både data in resp data ut Tar bort stackelement och återför data i den borttagna tunnan via *x . NULL A A invärde n void Pop( BottenPekarTyp *b, DataTyp *x ) { BottenPekarTyp b1 = *b ; if ( !ArTom( b1 )) { *x = b1 -> d ; *b = b1 -> next ; free( b1 ); } else printf("Tom stack!\n"); return; } invärde d e utvärde r s utvärde William Sandqvist bottenPek

16 William Sandqvist william@kth.se
Baklanges() Funktionen Baklanges() tar slut och har via referensen xString uppdaterat strängen i main(). NULL void Baklanges( char xString[] ) { int i; DataTyp data; BottenPekarTyp bottenPek = NULL ; for ( i=0 ; xString[i] != '\0' ; ++i ) { data.heltalsData = xString[i]; Push( &bottenPek , data ); } for ( i=0 ; xString[i] != '\0' ; ++i ) { Pop( &bottenPek , &data ); xString[i] = data.heltalsData ; } return; } A n d e r bottenPek s William Sandqvist

17 William Sandqvist william@kth.se
Kör main() int main(int argc, char *argv[]) { char strang[21] = {'\0'}; printf("Ge en str\204ng, max 20 tecken: --> "); scanf("%s", strang ); baklanges( strang ); printf ("\nBakl\204nges blir det:\t%s\n", strang ); system("PAUSE"); return 0; } William Sandqvist

18

19 William Sandqvist william@kth.se
Implementera en kö  en kö kan realiseras som en länkad lista via ett ”köhandtag” (struktur) håller man reda på början och slut i kön  med ”köhandtaget” kan man då lägga till data sist i kön resp plocka bort i början pekare data NULL börjanPek slutPek Själva kön ”köhandtaget” William Sandqvist

20 Kö funktionsprototyper
void StallDigIKon( KoTyp* , DataTyp);  placerar data sist i kön. void Nasta( KoTyp* , DataTyp* );  återför datat som är först i kön och tar sedan bort det från kön int ArTom( KoTyp );  returnerar 1 om kön är tom annars 0. DataTyp VemPaTur( KoTyp );  returnerar datat som ligger först i kön William Sandqvist

21 William Sandqvist william@kth.se
Kö programexempel Detta program tar emot heltal från tangentbordet och lagrar dem i en kö. På kommando kan det första talet i kön plockas bort. Provkör vid lab! William Sandqvist

22 William Sandqvist william@kth.se
Hur det fungerar /* queue.c */ #include <stdio.h> #include <stdlib.h> typedef struct { int heltal; } DataTyp ; typedef struct KoElementTyp { DataTyp d; struct KoElementTyp * next ; } KoElementTyp ; Datat som programmet skall bearbeta inläses till en struct av typen DataTyp. Funktionen StallDigIKon() tillfogar en next-pekare och lagrar detta , data och pekare, i en ny struktur av typen KoElementTyp. Denna inlänkas sedan sist i kön. pekare data NULL börjanPek slutPek Själva kön ”köhandtaget” William Sandqvist

23 William Sandqvist william@kth.se
Hur det fungerar typedef struct KoElementTyp { DataTyp d; struct KoElementTyp *next ; } KoElementTyp ; typedef KoElementTyp * KoElementPekarTyp ; typedef struct KoTyp KoElementPekarTyp koBorjanPek, koSlutPek ; } KoTyp ; StackElementTyp *BottenPekarTyp ; pekare data NULL börjanPek slutPek Själva kön ”köhandtaget” William Sandqvist

24 William Sandqvist william@kth.se
Ställ dig i kön Ny till slutet av kön pekare data pekare data pekare data NULL ”köhandtaget” data börjanPek slutPek pekare pekare data pekare data pekare data NULL ”köhandtaget” data börjanPek slutPek pekare William Sandqvist

25 William Sandqvist william@kth.se
StallDigIKon() void StallDigIKon( KoTyp* koPek, DataTyp x) { KoElementPekarTyp temp; temp = malloc(sizeof(KoElementTyp)) ; temp->d = x; temp->next = NULL ; if ( ArTom( *koPek )) koPek->koBorjanPek = koPek->koSlutPek = temp ; else koPek->koSlutPek->next = temp ; koPek->koSlutPek = temp ; } return ; William Sandqvist

26 William Sandqvist william@kth.se
Nästa! Ska betjänas pekare data pekare data pekare data NULL ”köhandtaget” data börjanPek slutPek pekare Ny först i kön! pekare data pekare data NULL ”köhandtaget” data börjanPek slutPek pekare William Sandqvist

27 William Sandqvist william@kth.se
Nasta() void Nasta( KoTyp* koPek, DataTyp* xPek) { KoElementPekarTyp temp = koPek->koBorjanPek ; if ( !ArTom( *koPek ) ) *xPek = temp -> d ; koPek->koBorjanPek = temp->next ; free( temp ); } else printf("Tom k\224! \n"); return; William Sandqvist

28 William Sandqvist william@kth.se
main() int main(int argc, char *argv[]) { char c ; DataTyp data; KoTyp ko = {NULL, NULL}; Info(); while (printf("--> "),scanf(" %c",&c), c != 'a' ) if ( c=='+'){scanf("%d", &data.heltal); StallDigIKon( &ko, data ); } else if ( c=='-' ) if ( ArTom( ko )) printf("Tom k\224! \n"); else { Nasta( &ko, &data ); printf("%d har tagits bort från k\224n!\n", data.heltal); } system("PAUSE"); return 0; William Sandqvist

29 William Sandqvist william@kth.se
ArTom() int ArTom(KoTyp k) { if(k.koBorjanPek != NULL) return 0; /* Är INTE tom */ else return 1; /* Är tom */ } Inte mycket att bråka om … William Sandqvist

30


Ladda ner ppt "William Sandqvist william@kth.se C-programmering ID120V Stack och Kö william@kth.se William Sandqvist william@kth.se."

Liknande presentationer


Google-annonser