Pokud se chceme vyhnout nutnosti přesouvat prvky pole , můžeme využít variantu založenou na cyklickém přidělování prvků statického pole. Zkuste si představit pole, do něhož budeme ukládat hodnoty, jako proužek papíru rozdělený na jednotlivé buňky a na koncích slepený tak, že za posledním prvkem pole následuje opět první prvek. Jednotlivé hodnoty pak budeme mít uložené v souvislé řadě kdekoliv v tomto poli, přičemž si budeme pamatovat pouze index, od kterého budeme prvky vybírat, a index, za který budeme prvky vkládat. Pokud by se stalo, že se oba indexy někde „potkají,“ znamená to, že došlo k zaplnění celého pole.
public class CyclicArrayQueue implements Queue
{
public CyclicArrayQueue(int size) {
_data = new Object[size];
}
public void enqueue(Object obj) {
_data[_last] = obj;
if( ++_last == _data.length ) _last = 0;
assert _first != _last : "Fronta je plna";
}
public Object dequeue() {
assert _first != _last : "Fronta je prazdna";
Object obj = _data[_first];
if( ++_first == _data.length ) _first = 0;
return obj;
}
public Object front() {
assert _first != _last : "Fronta je prazdna";
return _data[_first];
}
public boolean empty() {
return _first == _last;
}
protected Object[] _data;
protected int _first = 0;
protected int _last = 0;
}