import java.util.*;

// invariant:
// size() >= 0

public class StackDemo2<T> {
	private ArrayList<T> stack;
	
	public StackDemo2() {
		stack = new ArrayList<T>();
	}
	
	public int size() {
		return stack.size();
	}
	
	public boolean empty() {
		return size() == 0;
	}
	
	// requires !empty()
	// ensures that top() is removed && size() == old size() - 1
	public void pop() {
		stack.remove(size() - 1);
	}
	
	// ensures top() == element && size() == old size() + 1
	public void push(T element) {
		stack.add(element);
	}
	
	// requires !empty()
	// ensures that the last element pushed is returned 
	public T top() {
		return stack.get(size() - 1);
	}
}
