package com.coding.basic.stack; import java.util.EmptyStackException; import java.util.Objects; /** * Korben's Stack * * Created by Korben on 18/02/2017. */ public class Stack<T> { private int size; private Object[] dataArray = {}; public Stack() { } public int size() { return size; } public T push(T item) { ensureCapacity(size + 1); this.dataArray[size] = item; this.size++; return item; } @SuppressWarnings("unchecked") public T pop() { if (size == 0) { throw new EmptyStackException(); } T data = (T) this.dataArray[size - 1]; this.dataArray[size - 1] = null; this.size--; return data; } @SuppressWarnings("unchecked") public T peek() { if (size == 0) { throw new EmptyStackException(); } return (T) dataArray[size - 1]; } public boolean isEmpty() { return size == 0; } public synchronized int search(Object o) { for (int i = 0; i < size; i++) { if (Objects.equals(o, dataArray[i])) { return i; } } return -1; } private void ensureCapacity(int minCapacity) { if (minCapacity > dataArray.length) { int newCapacity = Math.max(minCapacity, dataArray.length * 2); Object[] newDataArray = new Object[newCapacity]; System.arraycopy(dataArray, 0, newDataArray, 0, dataArray.length); this.dataArray = newDataArray; } } }