PDA

View Full Version : [C++] ADT: Coda Statica Circolare


Brizio92
20-06-2013, 14:16
Salve a tutti, vorrei capire bene come realizzare questo tipo di ADT. Concettualmente, mi sembra di aver capito che la coda circolare, rispetto a quella lineare, è realizzata sempre con array, e una volta full permette di inserire i nuovi elementi dalla prima posizione (e neanche sono sicuro che questo sia corretto :doh: )

Ora, suppongo che la differenza stia nell'implementare diversamente append e pop, che sviluppo di solito in questo modo: (con c e t la coda e la testa)

append(int a) {
C[c]=a;
c=(c+1)%N;
nelem++;
}

pop(int a) {
a=C[t];
t=(t+1)%N;
nelem--;
}

(La coda la sviluppo come classe, quindi queste le uso come funzioni membro)

Cosa devo cambiare a queste funzioni affinché la coda abbia un comportamento circolare?
Mi sta bene anche qualche suggerimento, l'importante è capire come farla :)
Grazie in anticipo!

demos88
20-06-2013, 16:50
Aspetta... non è la coda ad essere circolare... è l'array con cui la implementi ad esserlo...
Una coda è una struttura astratta ben definita, la circolarità si riferisce al fatto che l'array con cui la implementi permette di inserire un elemento successivo a quello nell'ultimo indice ponendolo al primo indice (se la posizione è libera, altrimenti si estende l'array).

Detto questo, le funzioni potrebbero essere riscritte tenendo conto della circolarità:

append(int a){
if (c >= N) //c sfora l'array => portalo al primo
c = 0;
if (c == t) //coda piena se testa e coda coincidono
estendi(); //estendi array
C[c++] = a; //inserisci valore e post-incrementa c
nelem++;
}

pop(){
if (t >= N) //t sfora l'array => portalo al primo
t = 0;
a = C[t++]; //recupera valore e post-incrementa t
nelem++;
}

estendi(){
//codice dove crei un array di dimensione maggiore (doppia)
//e copi dentro tutti gli elementi dalla testa alla coda
//alla fine scarti l'array vecchio e a C assegni il nuovo array.
}


Ovviamente non ho testato il codice (non è nemmeno completo come noti).
L'idea è quella comunque.

Farro12
21-06-2013, 13:19
Ciao a tutti, il codice della coda circolare interesserebbe anche a me, potreste mostrarmi com'è implementata la funzione estendi() ?