Parte I |
Linguaggio
Java: tipi di dati astratti e strutture dati. Pile e Code. Leggere e
scrivere file di testo. |
La mia soluzione |
Realizzare Pile e
Code usando array |
1. Scrivere il
codice delle classi ArStack e
ArQueue
che realizzano, rispettivamente, l'interfaccia Stack e l'interfaccia Queue
(entrambe estendono l'interfaccia Container)
e che usanointernamente array parzialmente riempiti.
I metodi delle classi abbiano andamento asintottico O(1) (medio
se si ridimensiona l'array). 2. Scrivere una classe ArMain che: - legga un testo da file, separi le righe in parole e memorizzi le parole in una pila e in una coda. Il nome del file sia passato come argomento nella riga di comando. Si consideri una parola come una stringa delimitata da caratteri whitespaces. - stampi il contenuto della coda in un file, una parola per riga. Il nome del file sia passato come argomento sulla riga di comando. - stampi il contenuto della pila in un altro file. Il nome del file sia passato come argomento sulla riga di comando. uso: $java ArMain inputFile outputFile1 outputFile2 3. Eseguire l'analisi del testo contenuto nel file di testo itinerario.txt. |
EmptyStackException.java EmptyQueueException.java ArStack.java ArQueue.java ArMain.java |
Realizzare Pile e
Code usando liste concatenate |
1.
Scrivere il
codice delle classi LinkedLinkStack e LinkedLinkQueue
che realizzano, rispettivamente, l'interfaccia Stack e l'interfaccia Queue
(entrambe estendono l'interfaccia Container)
e che usanointernamente array parzialmente riempiti.
I metodi delle classi abbiano andamento asintottico O(1). 2. Scrivere una classe LinkedListMain che: - legga un testo da file per riga e memorizzi le righe in una pila e in una coda. Il nome del file sia passato come argomento nella riga di comando. - stampi il contenuto della coda in un file, una parola per riga. Il nome del file sia passato come argomento sulla riga di comando. - stampi il contenuto della pila in un altro file. Il nome del file sia passato come argomento sulla riga di comando. uso: $java LinkedListMain inputFile outputFile1 outputFile2 3. Eseguire l'analisi del testo contenuto nel file di testo palazzeschi.txt. Programmazione delle classi LinkedListStack.java e LinkedListQueue.java Ci sono due alternative: a. Programmare una classe per la classe lista concatenata e usare nella classi LinkedListStack e LinkedListQueue un esemplare di questa classe (LinkedList) per memorizzare i dati, come fatto a lezione. Nella classe LinkedList codificata a lezione non si e' definito il metodo int size() e quindi si realizzi il conteggio degli elementi del contenitore nelle classi LinkedListStack e LinkedListQueue (ad esempio definendo e aggiornando una variabile int size, come si fa solitamente). b. Definire la classe nodo (ListNode a lezione) come classe interna delle classi LinkedListStack e LinkedListQueue e gestire internamente ai metodi della classe LinkedListStack la programmazione della lista concatenata. La classe ListNode, nella forma piu' semplice, definisce variabili di esemplare senza specificatore di accesso, rendendole visibili nella classe in cui ListNode e' contenuta. Non e' una violazione del principio dell'incapsulamento, perche', essendo ListNode una classe interna, non e' visibile al di fuori della classe in cui e' definita: // Nodo della lista concatenata: classe interna class ListNode { Object element; // visibile nella classe di cui ListNode e' classe interna ListNode next; // visibile nella classe di cui ListNode e' classe interna public ListNode(Object obj, ListNode n) { element = obj; next = n; } public ListNode() { this(null, null); } } Con la definizione riportata sopra della classe ListNode, il metodo public void push(Object x) della classe LinkedListStack puo' essere codificato come segue, dove la variabile int size conta gli elementi contenuti nel vettore: /** aggiunge l'elemento specificato in cima alla pila O(1) @param dato nuovo elemento da aggiungere */ public void push(Object dato) { head.element = dato; head = new ListNode(null, head); size++; } ![]() Rappresentazione
grafica dell'inserimento di un dato nella lista concatenata
|
LinkedListStack.java LinkedListQueue.java LinkedListMain.java |
Realizzare una lista doppiamente concatenata | Si realizzi una lista
doppiamente concatenata nella classe DoublyLinkedList.java. Usare due nodi sentinella, senza dati, per marcare il primo nodo (head) e l'ultimo (tail). La lista vuota sia costituita dai due nodi sentinella, come la seguente: ![]() Provare i metodi della classe con la classe di prova DoublyLinkedListTester.java fornita dal docente. |
DoublyLinkedList.java |
Parte
II |
Linguaggio Java: tipi di dati astratti e strutture dati. Liste realizzate con array riempiti parzialmente o liste concatenate. Leggere e scrivere file di testo. | La
mia soluzione |
Lista con catena | Si
consideri il tipo di dati astratto Lista definito dalle interfacce List.java
e ListIterator.java. Si realizzi una lista usando una catena. Si lanci l'eccezione EmptyListException nel caso si cerchi di ispezionare o rimuovere elementi in una lista vuota. Si realizzi una classe di prova MainListaSuCatena che legga da un file un insieme di parole e le memorizzi in una lista. Il nome del file sia passato come argomento sulla riga di comandi. Si copi successivamente la lista in una nuova lista e si stampi il contenuto delle due liste. Si prepari un file di prova e si verifichi con questo il funzionamento delle classi. Come file di prova potete usare il file monti.txt, dove i vari token sono separati dal carattere ','. uso: $ java MainListaSuCatena inputFile |
EmptyListException.java ListaSuCatena.java MainListaSuCatena.java |
Lista con array | Si esegua
l'esercizio
precedente realizzando la lista in un array riempito parzialmente. uso: $ java MainListaSuArray inputFile |
ListaSuArray.java MainListaSuArray.java |
Realizzare un vettore | L'interfaccia MyList.java (che estende l'interfaccia Container) definisce un tipo di dati
astratto in cui i dati sono disposti in
sequenza. A ciascun dato e' associata una posizione nella sequenza,
espressa con un
numero intero >= 0, detto indice. Si codifichino le classi ArrayVector.java e LinkedListVector.java per realizzare l'interfaccia MyList, usando un array parzialmente riempito nella prima, una lista concatenata nella seconda. Si provino le classi realizzate con le seguenti classi di prova fornite dal docente: ArrayVectorTester.java e LinkedListVectorTester.java. Si risponda, successivamente, alle seguenti domande: 1. Qual e' la complessita' temporale del metodo public void add(int index, Object obj) nelle due realizzazioni? 2. Qual e' la complessita' temporale del metodo public Object get(int index) nelle due realizzazioni? 3. Qual e' la complessita' temporale del metodo public int indexOf(Object obj) nelle due realizzazioni? 4. Perche' la lista concatenata risulta meno efficiente dell'array riempito parzialmente per la realizzazione di questo tipo di dati astratto? |
ArrayVector.java LinkedListVector.java |
Parte
III |
Linguaggio
Java: tipi di dati astratti e strutture dati. Pile e Code. Leggere e
scrivere file di testo. |
La mia soluzione |
Coda realizzate tramite pile |
Scrivere la classe QueueByStacks che realizza
l'interfaccia Queue. La classe QueueByStacks usi al suo interno
esclusivamente strutture dati di tipo pila (nella classe non si possono
usare né array, né liste concatenate, né altre
strutture dati). Provare la classe QueueByStacks con il file di testo itinerario.txt. Per fare questo si modifichi la classe ArListMain. Suggerimento (da leggere se non riuscite a trovare una soluzione da soli). Qual e' l'andamento asintottico della complessita' temporale dei metodi della classe QueueByStacks? uso: $java QueueByStacksMain inputFile outputFile1 outputFile2 |
QueueByStacks.java QueueByStacksMain.java |
Pila realizzate tramite coda | Scrivere la classe StackByQueue
che realizza
l'interfaccia Stack. La classe usi esclusivamente strutture dati di
tipo coda (nella classe non si possono
usare né array, né liste concatenate, né altre
strutture dati). Provare la classe StackByQueue con il file di testo palazzeschi.txt, modificando la classe LinkedListMain. Suggerimento (da leggere se non riuscite a trovare una soluzione da soli). Qual e' l'andamento asintottico della complessita' temporale dei metodi della classe StackByQueue? uso: $java StackByQueueMain inputFile outputFile1 outputFile2 |
StackByQueue.java StackByQueueMain.java |
Coda realizzata tramite pila,
con l'aiuto del Java Stack |
Scrivere la classe
RecursiveQueueBySingleStack
che realizza
l'interfaccia Queue. La classe usi come struttura dati una sola pila
(nella classe non si possono
usare né array, né liste concatenate, né altre
strutture dati, né altre pile neanche temporanee). Provare la classe RecursiveQueueBySingleStack con il file di testo palazzeschi.txt, modificando la classe la classe LinkedListMain.. Algoritmo ricorsivo (da leggere se non riuscite a trovare una soluzione da soli). Qual e' l'andamento asintottico della complessita' temporale dei metodi della classe RecursiveQueueBySingleStack? uso: $java RecursiveQueueBySingleStackMain inputFile outputFile1 outputFile2 |
RecursiveQueueBySingleStack.java RecursiveQueueBySingleStackMain.java |