public class MyStack<E> {private Object[] elements; // 聲明一個object類型的數組private int size; // 數組中實際的元素個數public MyStack() {elements = new Object[10]; // 初始長度為10}// 檢查堆棧是否為空白public boolean empty() {return size == 0; // 元素個數為0返回true,否則返回false。}// 查看堆棧頂部的對象public E peek() {//如果沒有元素返回nullif (empty()) {return null; }//如果有元素就返回最後一個return (E) elements[size - 1];}// 移除堆棧頂部的對象public E pop() {E e = peek(); //拿到最後一個元素的備份elements[size - 1] = null; //給數組最後一個元素賦null值size--; //元素個數減1return e; }// 把項壓入堆棧頂部。public E push(E item) {ensureCapacity(size + 1); //檢查容量elements[size++] = item; //儲存傳進來的元素,元素個數自增1return item;}// 檢查容量是否足夠,不夠再原有的數組基礎建立新的數組private void ensureCapacity(int size) {int len = elements.length; //獲得數組現在的長度if (size > len) {int newLen = (len * 3) / 2 + 1; //每次數組擴充的容量elements = Arrays.copyOf(elements, newLen);}}// 返回對象在堆棧中的位置,以 1 為基數public int search(Object o) {int index = lastIndexOf(o); //得到元素在數組裡的下標return index == -1 ? index : size - index; }// 尋找下標的方法private int lastIndexOf(Object o) {if (empty()) {throw new EmptyStackException(); //如果數組為空白,就拋出一個自訂異常}//當傳進來的元素為空白時if (o == null) {for (int i = size - 1; i >= 0; i--) {if (elements[i] == null) {return i;}}//不為空白時} else {for (int i = size - 1; i >= 0; i--) {if (o.equals(elements[i])) {return i;}}}return -1; // 沒有找到,返回-1}// 自訂異常private static class EmptyStackException extends RuntimeException {public EmptyStackException() {super("堆棧為空白");}}}