![]() ![]() |
|
![]() ![]() |
Una coda (queue)
è un sequenza di zero o più elementi
in cui è possibile aggiungere elementi soltanto ad un estremo della sequenza, detto fondo (back), ed è possibile toglierli soltanto dall'altro estremo, detto testa (front). Politica di accesso: [primo elemento inserito, primo elemento rimosso] Esempi: una coda di persone alla cassa di un cinema,
una coda di ordini da evadere, una coda di file da stampare, ...
|
![]() ![]() |
|
![]() ![]() |
Rappresentiamo una coda come una sequenza di caselle
contenenti i suoi elementi, nell'ordine in cui sono stati inseriti. La
casella più a sinistra è la testa (front),
quella più a destra è il fondo (back).
|
![]() ![]() |
|
![]() ![]() |
Le operazioni definite su una coda sono le seguenti
:
|
![]() ![]() |
|
![]() ![]() |
La seguente interfaccia
definisce il tipo di dati astratto Queue
Si noti che fino a Java 1.4 le code non erano presenti nelle API, a partire da Java 1.5 sono state introdotte l'interfaccia Queue e numerose classi che la implementano, ma l'approccio è rivolto a risolvere problemi di sincronizzazione di programmi concorrenti e il loro studio esula da questo contesto. |
![]() ![]() |
|
![]() ![]() |
Assumiamo che
|
![]() ![]() |
|
![]() ![]() |
Supponiamo di voler esaminare tutti gli
elementi presenti in una coda, ad esempio per stamparli. Poiché
la politica di accesso FIFO consente di leggere solo l'elemento in testa
alla coda, dobbiamo necessariamente estrarre tutti gli elementi dalla
coda con dequeue, come nel
metodo seguente:
NB: poiché la nostra Queue<E> non implementa Iterable non è possibile usare il for semplificato per scorrere la coda.
|
![]() ![]() |
|
![]() ![]() |
Attenzione: Il metodo printDestroy
distrugge
la coda, che risulterà vuota anche per il metodo chiamante. Una
realizzazione più ragionevole dovrebbe ripristinare il contenuto
della coda prima di restituire il controllo:
|
![]() ![]() |
|
![]() ![]() |
Per gli esercizi che seguono si usi l'interfaccia Queue.java e la realizzazione
delle code fornita dalla classe VectorQueue.java.
Nota Bene
1) Si definisca un metodo con la seguente signature
2) Si definisca un metodo con la seguente signature
3) Si scriva una classe che prova i 4 metodi: printDestroy(), print(), reverse(), clone()
|
![]() ![]() |
|
![]() ![]() |
Le Code a Priorità sono un particolare tipo di coda in cui gli elementi vengono estratti non in base all'ordine di inserimento
ma in base al valore di una quantità reale detta priorità.
La testa della coda è l'elemento con la priorità più bassa. A partire dalla versione 1.5 le Api di Java forniscono un'implementazione efficiente delle code a Priorità, basata sull'uso degli Heap. Per una descrizione esauriente si rimanda alla documentazione ufficiale, qui ci limitiamo a segnalare un costruttore e alcuni metodi. La classe PriorityQueue<E> implementa le interfacce java.util.Iterable<E>, java.util.Collection<E>, java.util.Queue<E>. Un possibile costruttore è PriorityQueue(int initialCapacity, Comparator<E> comparator) che costruisce una coda a priorità vuota, con capacitagrave; iniziale initialCapacity, i cui elemementi saranno ordinati in base al Comparator<E> comparator Il metodo add(E item)inserisce un elemento di tipo E, aumentando la capacità della coda se necessario. Il metodo E poll()restituisce, togliendolo dalla coda, l'elemento con la priorità più bassa, oppure null se la coda è vuota. Il metodo E peek()restituisce, senza toglierlo dalla coda, l'elemento con la priorità più bassa, oppure null se la coda è vuota. Inoltre, tra gli altri, vi sono i metodi clear(), isEmpty(), toArray(), size(), dall'ovvio significato. Esempio (schematico) di uso di una java.util.PriorityQueue. Per un esempio completo si veda il documento PDF sulla Ricerca in spazi di stati.
|