java用数组实现栈的基本功能
除了借用数组以外,不使用其他api来实现java中stack的基本功能。实现压栈,出栈,清空栈,遍历栈等操作。
import java.util.Arrays;
public class TestArrayStack <E> {
private Object[] stack;
private int size;//数组中储存元素的个数。
public TestArrayStack(){
stack=new Object[10];
}
//判断栈是否为空
public boolean isEmpty(){
return size==0;
}
//获取栈顶的元素
public E peek(){
if(size==0)
return null;
return (E) stack[size-1];
}
//出栈操作
public E pop(){
E e =peek();
stack[size-1]=null;
size--;
return e;
}
//判断压栈时,数组是否已满,满则扩容
private void ensureCapacity(int size){
int len=stack.length;
if(size>len){//数组已满,则扩容10
int newLen=10;
// stack=Arrays.copyOf(size, newLen);
stack=Arrays.copyOf(stack, newLen);
}}
//压栈操作
public E push(E item){
ensureCapacity(size+1);//检查容量
stack[size++]=item;
return item;
}
//清空栈
public void removeAll() {
for(int i=0;i<stack.length;i++){
if(stack[i]!=null){
stack[i]=null;
size--;
}
}
}
//遍历栈
public void bianLi(){
for(int i=0;i<stack.length;i++){
System.out.print(stack[i]+" ");
}
}
public static void main(String[] args) {
TestArrayStack<Integer> tas=new TestArrayStack<>();
tas.push(0);
tas.push(89);
tas.push(100);
System.out.println("栈里面的元素数量:"+tas.size);
System.out.println("栈顶的元素:"+tas.peek());
System.out.println("栈里面的元素数量:"+tas.size);
tas.bianLi();
tas.pop();
System.out.println("栈顶的元素:"+tas.peek());
System.out.println("栈里面的元素数量:"+tas.size);
tas.removeAll();
System.out.println("==================");
System.out.println("栈里面的元素数量:"+tas.size);
System.out.println("栈顶的元素:"+tas.peek());
}
}
运行结果:
栈里面的元素数量:3
栈顶的元素:100
栈里面的元素数量:3
0 89 100 null null null null null null null 栈顶的元素:89
栈里面的元素数量:2
==================
栈里面的元素数量:0
栈顶的元素:null
不过上面对数组对栈的实现,也有一个很明显的缺点就是没有对出栈pop()和获取栈顶元素进行同步。解决方案在方法中加入synchronized 进行同步。