实现代码:
public class DynamicCapacityArrayStack<T> {
/**
* 存放数据的数组
*/
private T[] items;
/**
* 栈中元素初始化容量大小
*/
public static int initSize = 10;
/**
* 当前栈中元素个数
*/
private int currentSize;
/**
* 接收的对象类型
*/
Class<T> type;
public DynamicCapacityArrayStack(Class<T> type) {
this(type, initSize);
}
/**
* 初始化数组,申请一个大小为 initSize 的数组空间
*/
public DynamicCapacityArrayStack(Class<T> type, int initSize) {
DynamicCapacityArrayStack.initSize = initSize;
this.items = (T[]) Array.newInstance(type, initSize);
this.type = type;
}
/**
* 入栈操作
*/
public void push(T item) {
if (currentSize + 1 == initSize) {
T[] newArray = (T[]) Array.newInstance(type, initSize * 2);
// 扩容后的初始化容量大小
DynamicCapacityArrayStack.initSize = initSize * 2;
int preserveLength = Math.min(currentSize, initSize);
// 数组内容复制
if (preserveLength > 0) {
System.arraycopy(items, 0, newArray, 0, preserveLength);
}
// 将新的数组赋值给items
items = newArray;
}
items[currentSize++] = item;
}
/**
* 出栈操作
*/
public T pop() {
if (isEmpty()) {
return null;
}
T outData = (T) items[--currentSize];
return outData;
}
/**
* 获取栈顶元素
*/
public T peek() {
if (isEmpty()) {
return null;
}
T topData = (T) items[currentSize-1];
return topData;
}
/**
* 当前栈的长度
*/
public int getSize() {
return currentSize;
}
/**
* 栈是否为空
*/
public boolean isEmpty() {
return currentSize == 0;
}
}
测试示例:
public static void main(String[] args) {
DynamicCapacityArrayStack<String> stack = new DynamicCapacityArrayStack(String.class, 2);
stack.push("1");
stack.push("2");
stack.push("3");
int size = stack.getSize();
for (int i = 0; i < size; i++) {
String pop = stack.pop();
System.out.println(pop);
}
System.out.println(DynamicCapacityArrayStack.initSize);
}
结果: