Optimal: array + head + size
Time O(1) per operation Space O(k)enQueue writes at (head + size) % k; deQueue moves head forward modulo k. size tells full from empty.
class MyCircularQueue {
private final int[] data;
private int head = 0, size = 0;
public MyCircularQueue(int k) { data = new int[k]; }
public boolean enQueue(int value) {
if (isFull()) return false;
data[(head + size) % data.length] = value;
size++;
return true;
}
public boolean deQueue() {
if (isEmpty()) return false;
head = (head + 1) % data.length;
size--;
return true;
}
public int Front() { return isEmpty() ? -1 : data[head]; }
public int Rear() { return isEmpty() ? -1 : data[(head + size - 1) % data.length]; }
public boolean isEmpty() { return size == 0; }
public boolean isFull() { return size == data.length; }
}Verdict: Simple and constant time.