数据结构 实现栈容器
package datastructure;
//数据结构 实现栈容器
//栈结构的数据依存数组方式存储,存储时不能确定数据类型,使用泛型定义容器类型
//自定义的容器只有一种数据类型,所以元素与栈的泛型相同
import java.util.Arrays;
import java.util.EmptyStackException;
public class Stack {
private Object[] arr; //存放元素的物理位置
private int length=5; //数组的默认长度
private int size; //记录数组中元素的个数
private int index=-1; //操作数组下标位置的指针,定位-1是因为获取元素时,可以抛出异常
public Boolean empty(){
return this.size==0;
}
public E pop(){
//如果栈容器中没有元素,则抛出EmptyStackException异常
//使用-1可以在++index有便利
if (this.index==-1) {
throw new EmptyStackException();
}
this.size--;//return返回方法所需值后程序直接接触,所以不能定义在return后
//如果栈中有元素,则返回指针-1位置的元素,因为指针在元素放入数组时向后移动一次,也就是++index
//方法返回值类型为E,所以返回值时强转为E. 数组中元素为object类型需要强转
//数组中元素被返回,但应该没被删除,再次添加时新元素覆盖旧元素(个人见解)
return (E)(this.arr[index--]);
}
private void capacity(){
//缓存数组
if (this.size==0) {
this.arr=new Object[this.length];
}
//以1.5倍速度增加数组长度
if (this.size-this.length>=0) {
this.length=this.length+(this.length>>1);// >>1相当于除以2
}
//将新的数组长度赋给新数组,新数组为原数组,就完成了原数组的扩容
this.arr= Arrays.copyOf(this.arr,this.length);
}
public E push(E item){
this.capacity(); //每次添加元素时,判断是否初始化或者扩容
this.arr[++index]=item;//依据存入元素的顺序,一次从index=0出添加元素
size++; //返回数组中元素的个数
return item; //返回当前添加的元素
}
public static void main(String[] args) {
Stack bb= new Stack<>();
bb.push("a");
bb.push("b");
bb.push("c");
bb.push("d");
bb.push("e");
bb.push("f");
System.out.println(bb.pop());
System.out.println(bb.pop());
System.out.println(bb.pop());
System.out.println(bb.pop());
System.out.println(bb.pop());
System.out.println(bb.pop());
System.out.println(bb.pop());
//System.out.println(bb.pop()); //栈顶为空 EmptyStackException异常
System.out.println(bb.empty());
}
}