versione del 2-Dic-2007
Laboratorio IX: 3-Dic-2007                             
    
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++;
   }


push
 
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:

empty doubly linked list

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