package stack;

/**
 * Array based Stack implementation.
 * Useful if the initial capacity of the stack is well defined.
 * @author Winston Prakash
 */
public class ArrayStack<E> implements Stack<E>{
    int pointer = 0;
    
    private E[] stackData;
    
    public ArrayStack(){
        this(11);
    }
    
    public ArrayStack(int initialCapacity){
        stackData = (E[]) new Object[initialCapacity];
    }
    
    public boolean empty() {
        if( pointer == 0){
            return true;
        }else{
            return false;
        }
    }

    public E peek() {
        if(empty()){
            throw new EmptyStackException();
        }
        return (E) stackData[pointer - 1];
    }

    public void push(E item) {
        ensureCapacity();
        stackData[pointer++] = item;
    }

    public E pop() {
        E currentItem = peek();
        stackData[--pointer] = null;
        return currentItem;
    }

    public int search(E item) {
        for (int i = pointer - 1; i >= 0; i--){
            if(stackData[i] == item){
                return pointer - i;
            }
        }
        return -1;
    } 
    
    private void ensureCapacity(){
        if (pointer > stackData.length - 1){
            Object[] oldData = stackData; 
            stackData = (E[]) new Object[oldData.length * 2];
            System.arraycopy(oldData, 0, stackData, 0, oldData.length);
        }
    }
}