91 lines
2.0 KiB
Java
91 lines
2.0 KiB
Java
package queue;
|
|
|
|
/**
|
|
* @author Doschennikov Nikita (me@fymio.us)
|
|
*/
|
|
public class ArrayQueue extends AbstractQueue {
|
|
|
|
private Object[] queue;
|
|
private int head;
|
|
|
|
public ArrayQueue() {
|
|
queue = new Object[4];
|
|
head = 0;
|
|
}
|
|
|
|
@Override
|
|
public void enqueue(Object element) {
|
|
assert element != null : "Element must not be null";
|
|
ensureCapacity();
|
|
queue[(head + size) % queue.length] = element;
|
|
size++;
|
|
}
|
|
|
|
@Override
|
|
public void push(Object element) {
|
|
assert element != null : "Element must not be null";
|
|
ensureCapacity();
|
|
head = (head - 1 + queue.length) % queue.length;
|
|
queue[head] = element;
|
|
size++;
|
|
}
|
|
|
|
@Override
|
|
public Object element() {
|
|
assert size > 0 : "Queue is empty";
|
|
return queue[head];
|
|
}
|
|
|
|
@Override
|
|
public Object peek() {
|
|
assert size > 0 : "Queue is empty";
|
|
return queue[(head + size - 1) % queue.length];
|
|
}
|
|
|
|
@Override
|
|
public Object dequeue() {
|
|
assert size > 0 : "Queue is empty";
|
|
Object result = queue[head];
|
|
queue[head] = null;
|
|
head = (head + 1) % queue.length;
|
|
size--;
|
|
return result;
|
|
}
|
|
|
|
@Override
|
|
public Object remove() {
|
|
assert size > 0 : "Queue is empty";
|
|
int tail = (head + size - 1) % queue.length;
|
|
Object result = queue[tail];
|
|
queue[tail] = null;
|
|
size--;
|
|
return result;
|
|
}
|
|
|
|
@Override
|
|
protected Object get(int i) {
|
|
return queue[(head + i) % queue.length];
|
|
}
|
|
|
|
@Override
|
|
protected void clearImpl() {
|
|
queue = new Object[4];
|
|
head = 0;
|
|
}
|
|
|
|
@Override
|
|
protected AbstractQueue createEmpty() {
|
|
return new ArrayQueue();
|
|
}
|
|
|
|
private void ensureCapacity() {
|
|
if (size < queue.length) return;
|
|
Object[] newQueue = new Object[queue.length * 2];
|
|
for (int i = 0; i < size; i++) {
|
|
newQueue[i] = queue[(head + i) % queue.length];
|
|
}
|
|
queue = newQueue;
|
|
head = 0;
|
|
}
|
|
}
|