public class Stack<E> implements Cloneable { private E [] array; private int capacity; private int size; public Stack() { array = (E [])new Object[10]; capacity = 10; size = 0; } public Stack(int capacity) { this.capacity = capacity/10*10 + 10; array = (E [])new Object[this.capacity]; size = 0; } public E push(E item) { E temp [] = null; if(size == capacity) { capacity += 10; temp = (E [])new Object[capacity]; for(int i=0; i<size; i++) temp[i] = array[i]; array = temp; } array[size++] = item; return array[size-1]; } public E pop() throws EmptyStackException { if(size == 0) throw new EmptyStackException(); return array[--size]; } public E peek() throws EmptyStackException { if(size == 0) throw new EmptyStackException(); return array[size-1]; } public boolean empty() { return size == 0; } public int size() { return size; } public Object clone() throws CloneNotSupportedException { Stack<E> result = (Stack<E>) super.clone(); result.array = (E[]) array.clone(); return result; } }