实现栈的思路:
栈是动态集合,它实现的是一种后进先出(last-in, first-out)LIFO策略。栈一般支持压入(add),弹出(delete)。一般可以用数组A作为栈底层数据内存存储,可以通过属性new A().eleNum来记录栈数量。
每次调用弹出函数时,返回数组(eleNum -1)下标对应的值,然后将()(eleNum -1)作为新的栈数量。
每次调用压入函数时,判断底层数组是否长度足够(new A().length < eleNum + 1),如果不够可以按照给定的算法进行扩容,返回一个包含原来元素新长度的新数组,然后再把新的元素插入到(eleNum)下标位置,最后把(eleNum + 1)作为新的栈数量。
实现栈代码
/**
* <p>
* 数据结构 - 栈 - 后进先出(LIFO last-in first-out)
* </p>
*
* @author laizhiyuan
* @since 2019/9/25.
*/
public class Stack<T> {
private Object[] dataElement;
private int eleNum = 0;
private static final int DEFAULT_INIT_CAPACITY = 10;
public Stack() {
this.dataElement = new Object[DEFAULT_INIT_CAPACITY];
}
public Stack(int capacity) {
if (capacity < 0) {
throw new IllegalArgumentException("capacity can not than less 0");
}
this.dataElement = new Object[capacity];
}
@SuppressWarnings("unchecked")
public T pop() {
if (this.eleNum < 1) {
throw new ArrayIndexOutOfBoundsException(this.eleNum - 1);
}
this.eleNum = this.eleNum - 1;
Object o = this.dataElement[this.eleNum];
this.dataElement[this.eleNum] = null;
return (T) o;
}
public void push(T data) {
if (dataElement.length < this.eleNum + 1) {
int newLength = dataElement.length + (dataElement.length >> 1);
this.dataElement = Arrays.copyOf(this.dataElement, newLength);
}
this.dataElement[this.eleNum++] = data;
}
public void cleanAll() {
this.dataElement = new Object[DEFAULT_INIT_CAPACITY];
}
public boolean isEmpty() {
return this.length() > 0;
}
public int length() {
return this.eleNum;
}
}
测试栈代码
public static void main(String[] args) {
Stack<String> stack = new Stack<>();
System.out.println(stack.length());
System.out.println(stack.isEmpty());
stack.push("1");
stack.push("2");
stack.push("3");
stack.push("4");
stack.push("5");
stack.push("6");
stack.push("7");
stack.push("8");
stack.push("9");
stack.push("zhangsan");
stack.push("lisi");
stack.push("wangwu");
System.out.println(stack.length());
System.out.println(stack.isEmpty());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.length());
System.out.println(stack.isEmpty());
stack.cleanAll();
System.out.println(stack.length());
System.out.println(stack.isEmpty());
}
}
测试输出结果
0
false
12
true
wangwu
lisi
zhangsan
9
true
9
true
简单几行代码就可以实现一个栈数据结构,你get到了吗?
-END-
长按扫码关注【Java软件编程之家】公众号,一起学习,一起成长!