import java.util.*;

//invariant:
//size() >= 0 && nthFromTop(0) == top()

public class StackDemo3<T> {
	private ArrayList<T> stack;
	
	public StackDemo3() {
		stack = new ArrayList<T>();
	}

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