1 / 24

Pile e code

Pile e code. Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro. Pile: definizione informale. Una pila è una struttura dati lineare, cui gli elementi possono essere aggiunti o sottratti da un solo estremo (LIFO). Operazioni sulle pile.

lucio
Download Presentation

Pile e code

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Pile e code Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro AlgoLab - Pile e Code

  2. Pile: definizione informale • Una pila è una struttura dati lineare, cui gli elementi possono essere aggiunti o sottratti da un solo estremo (LIFO). AlgoLab - Pile e Code

  3. Operazioni sulle pile • Una pila (stack) si definisce astrattamente come una struttura dati su cui siano definite alemeno quattro operazioni: • Push(e,s) : aggiunge e alla pila s • Pop(s) : elimina l’elemento emergente da s • Top(s) : ritorna il valore dell’emergente di s • IsEmpty(s): ritorna true se s non ha elementi. Nota: se sè vuota, Pop(s) e Top(s) sono indefinite. AlgoLab - Pile e Code

  4. L’interfaccia Stack interface Stack { void push(Object newitem); // aggiunge newitem come emergente void pop(); // rimuove l’emergente dalla pila Object top(); // ritorna l’emergente senza rimuoverlo boolean empty(); // true se la pila e’ vuota } AlgoLab - Pile e Code

  5. L’interfaccia List interface List { void cons (Object newitem); // aggiunge newitem in testa alla lista boolean insert(Object newitem, int index); // inserisce newitem alla pos. index; false // se index > length() boolean delete(int index); // rimuove l’elemento di pos. index; false se // index not in 0..length()-1 Object retrieve(int index); // pre: index in 0..length()-1 // post: ritorna l’elemento di indice index public int length (); // ritorna la lunghezza } AlgoLab - Pile e Code

  6. Le pile implementate come liste Supponendo di aver riscritto SList in modo tale che implementi l’interfaccia List, e quindi sia generica (elementi di tipo Object): class StackByList extends SList implements Stack { public void push(Object newitem) {cons(newitem);} public void pop() {delete(0);} public Object top() {return retrieve(0);} public boolean empty() {return length() == 0;} } AlgoLab - Pile e Code

  7. La gerarchia dei tipi e delle classi L’implementazione delle pile presentata si basa dunque sulla gerarchia (interfacce e relazioni di implementazione in rosso, classi e relazioni di ereditarietà in blu): List Stack SList StackByList AlgoLab - Pile e Code

  8. Notazione polacca postfissa • Nella notazione polacca postfissa per le espressioni aritmetiche un operatore segue i suoi operandi. E’ definita dalla grammatica: <espressione> ::= <numerale> | <espressione> <espressione> <operatore> Esempi: (7 + 3) £ 5 si traduce in 7 3 + 5 £ 7 + 3 £ 5 si traduce in 7 3 5 £ + AlgoLab - Pile e Code

  9. Algoritmo di valutazione Valuta (Stringa espr) // espr è fatta di parole separate da spazi s := pila vuota while (scansione di espr non è finita) e := prossima parola di espr; if (e è un numerale) then Push(e,s) else // e è un operatore n := Top(s); Pop(s); // l’ordine di lettura ed eliminaz. m := Top(s); Pop(s); // dalla coda è importante … op :=  oppure  a seconda di e; Push(m op n, s) // … qui return Top(s). // se espr è un’espr. in not. polacca, s ha un solo el. AlgoLab - Pile e Code

  10. Esecuzione dell’algoritmo top 4 4 8 7 3 +     AlgoLab - Pile e Code

  11. Esecuzione dell’algoritmo top 8 4 8 7 3 +     4 AlgoLab - Pile e Code

  12. Esecuzione dell’algoritmo 4 8 7 3 +     top 7 8 4 AlgoLab - Pile e Code

  13. Esecuzione dell’algoritmo 4 8 7 3 +     top 3 7 8 4 AlgoLab - Pile e Code

  14. Esecuzione dell’algoritmo 4 8 7 3 +     top 10 8 4 AlgoLab - Pile e Code

  15. Esecuzione dell’algoritmo 4 8 7 3 +     top 80 4 AlgoLab - Pile e Code

  16. Esecuzione dell’algoritmo 4 8 7 3 +     top 2 80 4 AlgoLab - Pile e Code

  17. Esecuzione dell’algoritmo 4 8 7 3 +     top 40 4 AlgoLab - Pile e Code

  18. Esecuzione dell’algoritmo 4 8 7 3 +     top 44 AlgoLab - Pile e Code

  19. Code: definizione informale • Le code sono strutture lineari i cui elementi si inseriscono da un estremo e si estraggono dall’altro (FIFO) AlgoLab - Pile e Code

  20. Operazioni sulle code • Una coda (queue) si definisce astrattamente come una struttura dati su cui siano definite alemeno le operazioni: Enqueue(e,q) : aggiunge e come ultimo in q Dequeue(q) : elimina il primo in q Head(q) : ritorna il valore del primo in q IsEmpty(q): ritorna true se q non ha elementi. Nota: se qè vuota, Dequeue(q) e Head(q) sono indefinite. AlgoLab - Pile e Code

  21. Code realizzate con vettori (1) f r q coda vuota f r q 7 1 5 f r q 1 5 Dequeue(q) AlgoLab - Pile e Code

  22. Code realizzate con vettori (2) f r q 5 2 r f q 9 5 2 Enqueue(9,q) L’indice della locazione successiva (sia per f che per r) si calcola: i + 1 mod n (n = lunghezza del vettore) AlgoLab - Pile e Code

  23. Code realizzate con vettori (3) r f q 9 3 5 2 coda piena Condizione necessaria perché una coda di lunghezza n sia piena è: r + 1 mod n = f Tale condizione tuttavia non è sufficiente, dato che si verifica anche in quello di coda vuota r f q coda vuota AlgoLab - Pile e Code

  24. Code realizzate con liste front … rear Come si realizza tutto questo in Java, sfruttando il più possibile le interfacce e l’ereditarietà? AlgoLab - Pile e Code

More Related