ADT Stack

827 views
742 views

Published on

Implementazione di una ADT Stack tramite C. Molto visiva, ma senza uso di oggetti.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
827
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
11
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

ADT Stack

  1. 1. ADT Stack Implementazione tramite variabili dinamiche
  2. 2. Perché? <ul><li>L'implementazione con array (sia essa dinamica o statica) ci obbliga a allocare in anticipo la memoria.
  3. 3. Con l'implementazione a lista, utilizzeremo solo la memoria che ci serve (o quasi) </li></ul>
  4. 4. La struttura <ul><li>Per realizzare la cosa, utilizzeremo una struttura formata da due parti; la prima è un campo informativo (dato) che contiene, in questo esempio, un intero; la seconda è un puntatore che punta all'elemento successivo
  5. 5. Dovremo sempre avere modo di recuperare il primo elemento dello stack: chiameremo s la variabile (di tipo puntatore) che punta all'elemento attualmente in cima allo stack; </li></ul>
  6. 6. La struttura typedef struct Stack { int info; Stack *next; } //useremo due variabili, s & t Stack *s, *t;
  7. 7. Inizializzazione L'inizializzazione risulta piuttosto semplice: basta assegnare alla variabile s il valore NULL. Null è una costante predefinita del C/C++ che segnala un puntatore che non punta a... nulla, appunto. Come tale è molto utilizzata nei controlli. All'inizio il nostro stack è vuoto, quindi: s = null;
  8. 8. Inserimento di un elemento (PUSH) Per inserire un valore nello stack, dapprima creiamo un nuovo elemento in una variabile di appoggio, poi questo nuovo elemento diverrà il nuovo elemento “più in alto dello stack”. Dopo aver inserito l'informazione, lo agganceremo allo stack;
  9. 9. Il codice //creo nuovo elemento t= (stack *)malloc(sizeof(stack)); //inserisco valore (in questo caso 63) t->dato=83; //aggancio il nuovo elemento t->succ=s; //aggiorno s, che punta al nuovo “primo” elemento s=t;
  10. 10. Graficamente... <ul><li>s=NULL; </li></ul>MEMORIA HEAP s t
  11. 11. Graficamente... <ul><li>t= (stack *)malloc(sizeof(stack)); </li></ul>MEMORIA HEAP s t
  12. 12. Graficamente... MEMORIA HEAP <ul><li>t->dato=83; </li></ul>s t 83
  13. 13. Graficamente... MEMORIA HEAP <ul><li>t->succ=s; </li></ul>s t 83
  14. 14. Graficamente... MEMORIA HEAP <ul><li>s=t; </li></ul>s t 83
  15. 15. Graficamente... MEMORIA HEAP <ul><li>Ripetiamo il codice, ma questa volta inseriamo “12” </li></ul>s t 83
  16. 16. Graficamente...(x2) MEMORIA HEAP <ul><li>t= (stack *)malloc(sizeof(stack)); </li></ul>s t 83
  17. 17. Graficamente...(x2) MEMORIA HEAP <ul><li>t->dato=12 </li></ul>s t 83 12
  18. 18. Graficamente...(x2) MEMORIA HEAP <ul><li>t->succ=s; </li></ul>s t 83 12
  19. 19. Graficamente...(x2) MEMORIA HEAP <ul><li>s=t; </li></ul>s t 83 12
  20. 20. Eliminazione di un elemento (POP) <ul><li>Occorre operare in modo inverso
  21. 21. Per prima cosa preleviamo il dato (dopo aver controllato se lo stack non è vuoto) e lo assegnamo a una variabile (la useremo nel main)
  22. 22. Salviamo il vecchio valore di s in t
  23. 23. Poi cambiamo s in modo che punti all'elemento successivo
  24. 24. Infine, liberiamo lo spazio allocato in memoria </li></ul>
  25. 25. Il codice //recupero dato out=s->dato //salvo il puntatore al dato da eliminare t=s; //lo stack passa all'elemento successivo s=s->succ; //libero la memoria free(t);
  26. 26. Graficamente...(x2) MEMORIA HEAP <ul><li>out=s->dato; </li></ul>s t 83 12 out 12
  27. 27. Graficamente...(x2) MEMORIA HEAP <ul><li>t=s; </li></ul>s t 83 12
  28. 28. Graficamente...(x2) MEMORIA HEAP <ul><li>s=s->succ; </li></ul>s t 83 12
  29. 29. Graficamente...(x2) MEMORIA HEAP <ul><li>free(t); </li></ul>s t 83
  30. 30. Deinizializzazione <ul><li>Prima di chiudere il programma, occorre essere certi che lo stack sia vuoto, se no occorre farlo manualmente. </li></ul>
  31. 31. Migliorabile? <ul><li>Certamente si...poiché questo codice lascia alquanto a desiderare... </li><ul><li>Non fa alcun tipo di controllo
  32. 32. Non permette di “osservare” il dato nello stack senza toglierlo
  33. 33. Non è compatibile con l'interfaccia che abbiamo definito in precedenza </li></ul></ul>
  34. 34. QUESTI SONO I PROBLEMI DA RISOLVERE! BUON LAVORO

×