1.栈的定义
栈是一种只能从一端存取数据且遵循“后进先出(LIFO)”原则的线性存储结构。
2.实现栈容器
import java.util.*;
/*
* 自定义栈容器
*/
public class MyStack<E> {
private Object[] arr; //延迟加载的策略
private int stackLength = 4; //数组的默认长度
private int size; //记录栈容器的元素个数
private int index = -1; //操作数组下标位置的指针
/*
* 判断栈容器是否为空
*/
public boolean empty() {
return this.size == 0;
}
/*
* 获取栈顶元素
*/
public E pop() {
//如果栈容器中没有元素则抛出异常
if(this.index==-1) {
throw new EmptyStackException();
}
//记录元素个数
this.size--;
//返回栈顶元素
return (E)this.arr[this.index--]; //指针--,同时强转类型
}
/*
* 向栈容器中添加元素
*/
public E push(E item) {
//初始化数组
this.capacity();
//向数组中添加元素
this.arr[++index] = item;
//记录元素个数
this.size++;
return item;
}
/*
* 完成数组初始化或者以1.5倍对数组扩容
*/
private void capacity() {
//数组初始化
if(this.arr==null) {
this.arr = new Object[this.stackLength];
}
//以1.5倍对数组扩容
if(this.size-(this.stackLength-1)>=0) {
this.stackLength = this.stackLength+(this.stackLength>>1); //位移操作快
this.arr = Arrays.copyOf(this.arr,this.stackLength); //扩容操作
}
}
public static void main(String[] args) {
MyStack<String> myStack = new MyStack<>();
myStack.push("a");
myStack.push("b");
myStack.push("c");
myStack.push("d");
myStack.push("e");
myStack.push("f");
System.out.println(myStack.size);
System.out.println(myStack.pop());
System.out.println(myStack.pop());
System.out.println(myStack.pop());
}
}
/*
6
f
e
d
*/