COSTA: COSt and Termination Analyzer for Java Bytecode
    
    package net.datastructures;
 /**
  * Implementation of the Stack interface using a fixed-length array.
  * An exception is thrown if a push operation is attempted when the
  * size of the stack is equal to the length of the array.
  * 
  * @author Natasha Gelfand
  * @author Roberto Tamassia
  * @see FullStackException
  */
public class ArrayStack implements Stack {

	/**
	 * Default length of the array used to implement the stack.
	 */
	public static final int CAPACITY = 1000;

	/**
	 * Length of the array used to implement the stack.
	 */
	protected int capacity;

	/**
	 * Array used to implement the stack.
	*/
	protected Object S[];

	/**
	 * Index of the top element of the stack in the array.
	 */
	protected int top = -1;

	/**
	* Initialize the stack to use an array of default length CAPACITY.
	*/
	public ArrayStack() {
		this(CAPACITY);
	}

	/**
	 * Initialize the stack to use an array of given length.
	 * 
	 * @param cap length of the array.
	 */
	public ArrayStack(int cap) {
		capacity = cap;
		S = new Object[capacity];
	}

	/**
	 * O(1) time.
	 */
	public int size() { 
		return (top + 1);
	}

	/**
	 * O(1) time.
	 */
	public boolean isEmpty() {
		return (top < 0);
	}

	/**
	 * O(1) time.
	 * @exception FullStackException if the array is full.
	 */
	public void push(Object obj) throws FullStackException {
		if (size() == capacity)
			throw new FullStackException("Stack overflow.");
		S[++top] = obj;
	}

	/**
	 * O(1) time.
	 */
	public Object top() throws EmptyStackException {
		if (isEmpty())
			throw new EmptyStackException("Stack is empty.");
		return S[top];
	}

	/**
	 * O(1) time.
	 */
	public Object pop() throws EmptyStackException {
		Object elem;
		if (isEmpty())
			throw new EmptyStackException("Stack is Empty.");
		elem = S[top];
		S[top--] = null; // dereference S[top] for garbage collection.
		return elem;
	}

	public static void main(String[] args) {

		// Testing for method push
		ArrayStack test = new ArrayStack();
		for (int i = 0; i < 10; i++) {
			Integer testNumber = i;
			test.push(testNumber);
		}
		
	}
}