Coda a doppio ingresso (Deque) Definizione informale Una coda a doppio ingresso o Deque è un TDA simile alla Coda che supporta inserimenti e cancellazioni ad entrambe le estremità Deque si pronuncia deck per evitare confusioni con il metodo dequeue Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 2 1
Operazioni sulla Deque 1 insertfirst(e,d) aggiunge e come primo in d insertlast(e,d) aggiunge e come ultimo in d removefirst(d) restituisce, eliminandolo, il primo elemento in d removelast(d) restituisce, eliminandolo, l ultimo primo elemento in d Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 3 Operazioni sulla Deque 2 first(d) restituisce il primo elemento in d last(d) isempty(d) restituisce l ultimo elemento in d ritorna true se d non ha elementi; false altrimenti Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 4 2
Interfaccia Deque 1 public interface Deque { public void insertfirst(object o); public void insertlast(object o); public Object removefirst() throws DequeEmptyException; public Object removelast() throws DequeEmptyException; Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 5 Interfaccia Deque 2 public Object first() throws DequeEmptyException; public Object last() throws DequeEmptyException; public int size(); public bool isempty(); Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 6 3
Lista doppiamente lincata Per implementare efficientemente il TDA Deque conviene utilizzare la struttura dati lista doppiamente lincata È come una lista lincata, ma ogni nodo memorizza anche un riferimento al nodo precedente (oltre a memorizzare un riferimento ad un elemento ed un riferimento al nodo successivo) Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 7 Classe DLNode 1 class DLNode { private Object element; private DLNode next, prev; DLNode() { this(null, null, null); DLNode(Object e, DLNode p, DLNode n) { element = e; next = n; prev = p; Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 8 4
Classe DLNode 2 void setelement(object newelem) { element = newelem; void setnext(dlnode newnext) { next = newnext; void setprev(dlnode newprev) { prev = newprev; Object getelement() { return element; DLNode getnext() { return next; DLNode getprev() { return prev; Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 9 Nota Per migliorare sia l efficienza del codice sia per semplificare la programmazione conviene usare due nodi sentinella header È un nodo che punta alla testa (head) della Deque Ha il campo prev settato a null trailer È un nodo che punta alla coda (tail) della Deque Ha il campo next settato a null Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 10 5
Esempio header next prev element Avellino Napoli Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 11 Esercizio Implementare l interfaccia Deque (scrivere la classe DLinkedDeque) usando una lista doppiamente lincata public class DLinkedDeque implements Deque { DLNode header, trailer; //sentinelle int size; //numero di elementi nella deque... Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 12 6
Costruttore di DLinkedDeque public DLinkedDeque() { // inizializza una Deque vuota header = new DLNode(); trailer = new DLNode(); header.setnext(trailer); // fa puntare l header // al trailer trailer.setprev(header); // fa puntare il trailer // all header size = 0; Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 13 Metodo insertfirst public void insertfirst(object o) { DLNode secondo = header.getnext(); DLNode primo = new DLNode(o, header, secondo); secondo.setprev(primo); header.setnext(primo); size++; Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 14 7
Esempio header secondo next prev Avellino Napoli o primo Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 15 Esempio header secondo next prev Avellino Napoli o primo Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 16 8
Esercizi Implementare il TDA Stack usando una coda a doppio ingresso Cambia la complessità di tempo dei vari metodi? In caso affermativo, indicare come. Implementare il TDA Queue usando una coda a doppio ingresso Cambia la complessità di tempo dei vari metodi? In caso affermativo, indicare come. Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 17 9