Optimal: input and output stacks
Time O(1) amortised per operation Space O(n)Push onto in. For pop/peek, if out is empty, move everything from in to out (reversing it), then use out's top. Each element moves from in to out once, so operations are O(1) amortised.
import java.util.ArrayDeque;
import java.util.Deque;
class MyQueue {
private final Deque<Integer> in = new ArrayDeque<>(), out = new ArrayDeque<>();
public MyQueue() {}
public void push(int x) { in.push(x); }
public int pop() { shift(); return out.pop(); }
public int peek() { shift(); return out.peek(); }
public boolean empty() { return in.isEmpty() && out.isEmpty(); }
private void shift() {
if (out.isEmpty()) while (!in.isEmpty()) out.push(in.pop());
}
}Verdict: The standard design.