import java.util.*; //invariant: //size() >= 0 && nthFromTop(0) == top() public class StackDemo3 { private ArrayList stack; public StackDemo3() { stack = new ArrayList(); } // requires !empty() public T top() { return nthFromTop(0); } // requires 0 <= n < size() && !empty() public T nthFromTop(int n) { return stack.get(topIndex() - n); } private int topIndex() { return size() - 1; } public int size() { return stack.size(); } public boolean empty() { return size() == 0; } // requires !empty() // ensures top() == old nthFromTop(1) && size == old size() - 1 public void pop() { stack.remove(topIndex()); } // ensures top() == element && size() == old size() + 1 public void push(T element) { stack.add(element); } }