用数组实现一个下压栈 (能够动态调整数组大小)
在计算机的世界中,栈这种数据结构及其重要。后进先出是栈的主要用途。
日常生活中,栈的思想随处可见:
- 电梯中的人,总是后进先出
- 交给别人的文件,后面交的人的文件总是会被先处理。
下面是用数组的方式实现一个栈的代码。
import java.util.Iterator;
/**
* @author zhangjinglong
* @date 2019-06-05-20:41
* 用数组实现一个下压栈 (能够动态调整数组大小)
*/
public class ResizingArrayStack<Item> implements Iterable<Item> {
private Item[] a=(Item[]) new Object[1];//栈元素 注意这里不能直接写成 Item[] a =new Item[1];编译会报错
private int N=0; //元素数量
public boolean isEmpty(){//栈是否为空
return N==0;
}
public int size(){ //返回栈的大小
return N;
}
private void resize(int max){
//将栈移动到一个大小为max的新数组
Item[] temp=(Item[]) new Object[max];//定义临时数组
for (int i = 0; i < N; i++) {
temp[i]=a[i];//引用复制
}
a=temp;//改变a的原始指向,以达到动态改变数组大小的目的。
}
public void push(Item item){
//将元素添加到栈顶
if(N==a.length) resize(a.length*2);//如果栈元素个数等于数组长度,给数组扩容。
a[N++]=item;//
}
public Item pop(){
//从栈顶删除元素
Item item=a[--N];//N表示元素个数,--N后是数组的真实下标
a[N]=null;//这一步很重要,将删除的对象引用置为null,方便JVM回收删除的对象,避免对象游离。
if(N>0 && N==a.length/4){
resize(a.length/2);
}
return item;//返回删除的元素
}
public Iterator<Item> iterator(){
return new ReverseArrayIterator();
}
private class ReverseArrayIterator implements Iterator<Item>{
//支持后进先出的迭代
//定义迭代器的目的:方便使用java的forEach语法迭代访问栈中元素
private int i=N;
public boolean hasNext(){return i>0;}
public Item next(){return a[--i];}
public void remove(){}//这个接口方法一般不实现它
}
public static void main(String[] args) {
ResizingArrayStack<String> test=new ResizingArrayStack<>();
test.push("I");
test.push("Love");
test.push("You");
System.out.println(test.pop());
System.out.println("栈是否为空:"+test.isEmpty());
for(String s:test){
System.out.println("元素:"+s);
}
}
}