java学习札记——自定义实现Stack集合
java学习笔记——自定义实现Stack集合
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() { //如果没有元素返回null if (empty()) { return null; } //如果有元素就返回最后一个 return (E) elements[size - 1]; } // 移除堆栈顶部的对象 public E pop() { E e = peek(); //拿到最后一个元素的备份 elements[size - 1] = null; //给数组最后一个元素赋null值 size--; //元素个数减1 return e; } // 把项压入堆栈顶部。 public E push(E item) { ensureCapacity(size + 1); //检查容量 elements[size++] = item; //保存传进来的元素,元素个数自增1 return 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("堆栈为空"); } } }