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("堆栈为空");
}
}
}
java学习笔记——自定义实现Stack集合
最新推荐文章于 2022-08-30 16:05:15 发布