package com.bruce.homework0226; import com.bruce.utils.MyException; import java.io.Serializable; import java.util.Arrays; /** * 用数组实现一个栈的基本功能:push,pop,isEmpty,size,clear方法 * @Version: 0.0 * Created by Bruce.Jiao on 17-2-24. */ public class StackV00<T> implements Serializable{ /** * 底层存放栈元素的数组 */ private Object[] elementData; /** * 栈中元素的个数 */ private int size; /** * 每次扩容增加的大小 */ private int capacityIncrement; /** * 空构造,数组初始长度为10 */ public StackV00() throws MyException{ this(10); } /** * 有参构造 * @param initCapacity 用户指定的栈空间初始大小(底层数组的初始大小) * @throws MyException 对传入参数进行判断,不符合要求抛出异常 */ public StackV00(int initCapacity) throws MyException{ this(initCapacity,0); } /** * 有参构造 * @param initCapacity 用户指定的栈空间初始大小(底层数组的初始大小) * @param capacityIncrement 用户指定的每次扩容大小(当空间不足时,每一次扩容增加的大小) * @throws MyException 对传入参数进行判断,不符合要求抛出异常 */ public StackV00(int initCapacity, int capacityIncrement) throws MyException{ if(initCapacity < 0 || capacityIncrement <0){ throw new MyException(initCapacity < 0?"栈空间大小不能为负数":"扩容参数不能为负数"); } elementData = new Object[initCapacity]; } /** * 向栈中添加元素 * @param value 添加的元素,可以为null * @return 添加成功后的元素 */ public T push(T value){ ensureCapacity(size+1); //将新增的元素放在size索引处,并且将size加1 elementData[size++] = value; return value; } /** * 从栈中获取元素,拿到当前所有元素中最后添加进来的元素 * @return 最后的元素 */ public T pop(){ //拿到最后的元素,在栈中将该元素删除,将size减1 T data = (T) elementData[size-1]; elementData[size--] = null; return data; } /** * 判断栈是否为空 * @return true:空栈,无元素;false:有元素 */ public boolean isEmpty(){ return size == 0; } /** * 获取栈大小(元素数量,包括null元素) * @return 栈中元素大小 */ public int size(){ return size; } /** * 清空栈中元素 */ public void clear(){ int oldCapacity = elementData.length; size = 0; elementData = new Object[oldCapacity]; } /** * 判断数组尺寸 * @param minCapacity */ public void ensureCapacity(int minCapacity){ int oldCapacity = elementData.length; //如果传入值大于当前数组尺寸,对数组进行扩容 if(minCapacity > oldCapacity){ //如果capacityIncrement大于0,每次扩容用户指定的大小,否则每次将当前数组尺寸扩大一倍 int newCapacity = oldCapacity + capacityIncrement > 0 ? capacityIncrement : oldCapacity; //元素数组扩容,并且将原有的元素复制到新数组中 elementData = Arrays.copyOf(elementData,newCapacity); } } /** * 拿到底层的静态数组 * @return 底层元素数组 */ public Object[] toArray(){ return Arrays.copyOf(elementData,size); } /** * toString方法,可以直接打印出栈底层的数组 * @return */ @Override public String toString() { return Arrays.toString(toArray()); } /** * 仅仅作为自己查看底层数组长度的方法, * @return 数组长度,大于等于元素个数 */ int arrayLength() { return elementData.length; } }