【数据结构与算法(Java描述)】栈

来源于书籍《数据结构与算法(Java描述)》邓俊辉 著 机械工业出版社

栈是存放对象的一种特殊容器,在插入与删除对象时,这种结构遵循后进先出(Last-in-first-out,LIFO)的原则⎯⎯也就是说,对象可以任意插入栈中,但每次取出的都是此前插入的最后一个对象。比如一摞椅子(如 图二.1 所示),只能将最顶端的椅子移出,也只能将新椅子放到最顶端⎯⎯这两种操作分别称作入栈(Push)和退栈(Pop)。
在这里插入图片描述

栈是最基本的数据结构之一,在实际应用中几乎无所不在。例如,网络浏览器会将用户最近访问过的地址组织为一个栈:用户每访问一个新页面,其地址就会被存放至栈顶;而用户每次按下“Back”按钮,最后一个被记录下的地址就会被清除掉。再如,当今主流的文本编辑器大都支持编辑操作的历史记录功能:用户的编辑操作会被依次记录在一个栈中;一旦出现误操作,用户只需按下“Undo”按钮,即可撤销最近一次操作并回到此前的编辑状态。

使用数组实现栈

public interface Stack {
    
    

    int getSize();//返回栈的元素个数

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

    Object top() throws StackEmptyException;//取栈顶元素但不删除

    Object pop() throws StackEmptyException;//出栈

    void push(Object ele);//入栈

}
public class StackEmptyException extends RuntimeException{
    
    

    public StackEmptyException(String err){
    
    
        super(err);
    }
}
public class StackFullException extends RuntimeException{
    
    

    public StackFullException(String err){
    
    
        super(err);
    }
}
public class StackByArray implements Stack{
    
    
    public static final int CAPACITY = 1024;//数组默认容量
    protected int capacity;//实际容量
    protected Object[] S;//元素数组
    protected int top = -1;//栈顶元素位置

    //按默认容量创建栈对象
    public StackByArray(){
    
    
        this(CAPACITY);
    }

    //按指定大小创建栈对象
    public StackByArray(int size){
    
    
        capacity=size;
        S=new Object[capacity];
    }

    //取出当前栈的规模
    @Override
    public int getSize() {
    
    
        return (top+1);
    }

    @Override
    public boolean isEmpty() {
    
    
        return (top<0);
    }

    @Override
    public Object top() throws StackEmptyException {
    
    
        if(isEmpty()){
    
    
            throw new StackEmptyException("意外:栈为空");
        }
        return S[top];
    }

    @Override
    public Object pop() throws StackEmptyException {
    
    
        Object ele;
        if(isEmpty()){
    
    
            throw new StackEmptyException("意外:栈为空");
        }
        ele=S[top];
        S[top--] = null;//S[top]=null;top=top-1;
        return ele;
    }

    @Override
    public void push(Object ele) {
    
    
        if(capacity==getSize()){
    
    
            throw new StackFullException("意外:栈溢出");
        }
        S[++top] = ele;//top=top+1;S[top]=ele;
    }


    public static void main(String[] args) {
    
    
        StackByArray stackByArray=new StackByArray();
        //利用栈进行数组倒置
        int[] test={
    
    0,1,2,3,4,5};
        for (int i = 0; i < test.length; i++) {
    
    
            stackByArray.push(test[i]);
        }
        for (int i = 0; i < test.length; i++) {
    
    
            test[i]= (int) stackByArray.pop();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42158942/article/details/107863005