数组实现栈的顺序存储功能

首先先了解一下栈的特性:
栈:stack,又称堆栈,它是运算受限的线性表,其限制是仅允许在表的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作。

简单的说:采用该结构的集合,对元素的存取有如下的特点:
1.先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素)。例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹。
2.栈的入口、出口的都是栈的顶端位置。

因为栈的操作会有异常的情况存在,所以自定义一个异常,继承于RuntimeException

/**
 * 自定义当栈为空时进行操作时的异常
 */
public class StackEmptyException extends RuntimeException{
    public StackEmptyException(String err){
        super(err);
    }
}

先定义一个栈的功能接口,方便操作

/**
 * 定义栈常用功能的接口
 */
public interface Stack {
    //返回栈中的元素个数
    public int getSize();

    //入栈
    public void push(Object obj);

    //出栈
    public Object pop() throws StackEmptyException;

    //去除栈顶元素
    public Object peek() throws StackEmptyException;

    //判断是否栈为空
    public boolean isEmpty();

}

运用数组特性实现栈的顺序存储功能

/**
 * 栈的顺序存储实现
 */
public class StackArray implements Stack{
    private final int LEN=10;   //定义栈的默认存储容量
    private Object[] elements;  //定义数据元素数组
    private int top;    //栈顶指针

    //构造方法初始化数据
    public StackArray() {
        top=-1;                 //此时栈为空
        elements=new Object[LEN];
    }

    //辅助方法,当栈的容量不够时进行扩容
    public void escape(){
        Object[] arr=new Object[LEN+10];
        System.arraycopy(elements,0,arr,0,elements.length);
        elements=arr;
    }
    //获取元素个数
    @Override
    public int getSize() {
        return top+1;
    }

    //入栈
    @Override
    public void push(Object obj) {
        if (getSize()>=elements.length) escape();
        elements[++top]=obj;
    }

    //出栈
    @Override
    public Object pop() throws StackEmptyException {
        if (getSize()<1)
            throw new StackEmptyException("错误,栈中没有元素");
        Object obj=elements[top];
        elements[top--]=null;
        return obj;
    }

    //取栈顶元素
    @Override
    public Object peek() throws StackEmptyException {
        if (getSize()<1)
            throw new StackEmptyException("错误,栈为空");
        Object obj=elements[top];
        return obj;
    }

    //判断栈是否为空
    @Override
    public boolean isEmpty() {
        return top==-1;
    }
}
发布了42 篇原创文章 · 获赞 6 · 访问量 2977

猜你喜欢

转载自blog.csdn.net/qq_44666176/article/details/98784989