(java) array circolari e code

  • 2 Risposte
  • 5280 Visite

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline aduri

  • Nuovo Iscritto
  • *
  • 18
(java) array circolari e code
« il: 28 Ottobre 2006, 10:35 »
Salve a tutti lo scritto di Java l’ho passato e ringrazio tutti (Max in particolare) ma per l’orale sto analizzando questo codice ma ho alcuni dubbi su dei metodi.


Codice: [Seleziona]
public class ArrayQueue implements Queue {
int first, last, size;
Object[] data;
public ArrayQueue(int n){
size=n;
data = new Object[size];
first=last=-1;
}
public boolean isFull() {
return first==0 && last==size-1 || first==last+1; //caso a e b (chiaro)
}
public boolean isEmpty() {
return first==-1;  // array non inizializzato
}
public Object front() { return data[first];} //metodo che ritorna il primo elemento

public void clear() { last=first=-1;}}

public void enqueue(Object el) {
if (last==size-1 || last==-1){
data[0]=el;
last=0;
if (first ==-1)
first=0;
}
else
data[++last]=el;
}
public Object dequeue() {
Object tmp = data[first];
if (first==last)
last=first=-1;
                 else if (first == size-1)
first=0;
   else
first++;
return tmp;
}



Nel metodo enqueue il primo if dice che se l’ultimo elemento dell’array esiste o l’array non e’ inizializzato si carica l’oggetto el nella prima posizione dell’array last si mette a 0 perche’ last corrisponde a first? Non caapisco poi il secondo if (first==-1) first=0; non dovrebbe anche qua caricare l’oggetto el essendo l’array non inizializzato?
Il metodo dequeue crea un oggetto temporaneo col primo elemento dell’array poi col primo if fa un controllo per vedere se e’ presente un solo elemento se si’ ritorna l’array vuoto last=first=-1 poi controlla se c’e’ un solo elemento nell’ultima posizione e qui non capisco che differenza ci sia rispetto al precedente (non dovrebbe ritornare array vuoto first=last=-1)?

Offline Max

  • Ex-Staff
  • Membro Anziano
  • *****
  • 363
  • Sesso: Maschio
    • http://www.massimostellin.it
Re: (java) array circolari e code
« Risposta #1 il: 28 Ottobre 2006, 12:46 »
allora:
in enqueue il primo if controlla, come hai detto tu, che la coda sia piena o che la cosa sia vuota, se è vero uno dei due controlli riporta l'indice dell'ultimo oggetto a zero e assegna l'oggetto nuovo alla casella 0 dell'array, in parole povere se la coda è vuota la inizializza se è piena sovrascrive l'oggetto più vecchio con quello nuovo;
Inoltre controlla che se anche l'indice al primo oggetto è uguale a -1 (quindi siamo nel caso che la cosa sia vuota) e sposta lo stesso indice al primo oggetto disponibile.
Invece se i primi due controlli sono entrambi falsi (quindi nella coda c'è come minimo un oggetto) incrementa l'indice all'ultimo oggetto di una posizione e assegna il nuovo oggetto alla nuovo valore dell'indice all'ultimo oggetto.

Il metodo dequeve estrae il primo oggetto dalla coda, controlla che dentro la coda ci sia solo un oggetto (first==last), se è vero resetta la coda senò controlla che l'indice al primo oggetto sia arrivato alla fine della coda, se è vero riporta l'indice a zero in modo da poter scorrere di nuovo la cosa dall'inizio, se è falso (quindi l'indice sta in un posto imprecisato all'interno della cosa) lo incrementa di una posizione.
Alla fine di tutto ritorna l'oggetto che era al primo posto della coda. 

Offline aduri

  • Nuovo Iscritto
  • *
  • 18
Re: (java) array circolari e code
« Risposta #2 il: 28 Ottobre 2006, 18:06 »
Quindi se ho capito bene graficamente il primo if verifica che ci sia un solo elemento in una qualsiasi posizione della coda, l’else if verifica che ci sia un solo elemento in fondo alla coda e l’ultimo else sposta l’indice a first +1 per il prossimo dequeue e ritorna il primo oggetto che era salvato nel buffer.

Grazie sei stato utile come sempre