Seconda idea:
-
mettiamo gli elementi della coda in posizioni contigue dell'array
(non necessariamente all'inizio)
-
oltre a back,
usiamo una variabile front
per indicare il prossimo elemento da estrarre
Stato della coda
|
|
Rappresentazione con array (2)
A
|
B
|
C
|
|
|
|
|
|
0
|
1
|
2
|
3
|
4
|
...
|
|
n-1
|
|
-
enqueue: come
prima (inserisce e incrementa
back,
se necessario dopo aver raddoppiato l'array);
-
dequeue: restituisce
l'elemento di posizione
front
e incrementa front: ora la
complessità è costante.
PROBLEMA: Cattiva gestione della memoria.
Si rischia di raddoppiare l'array anche se la coda contiene pochi elementi.
Ad esempio, potremmo avere
Stato della coda
|
|
A
|
B
|
C
|
...
|
P
|
Q
|
R
|
S
|
0
|
1
|
2
|
...
|
n-4
|
n-3
|
n-2
|
n-1
|
|
L'operazione enqueue(T)
raddoppierebbe l'array. Si noti che invece si potrebbero riutilizzare le
posizioni 0, 1, ..., n-5 dell'array che contengono elementi
già estratti.
Questo ci porta alle seguenti scelte finali... |