Files
paradigms/java/queue/ArrayQueue.java
2026-04-08 21:25:17 +03:00

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;
}
}