栈  ---先进后出(可以想象为手枪弹夹)

  最后放入的元素为栈顶元素

  栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

  

package demo2;

//用数组实现一个栈
public class MyStack {

    // 栈的底层我们使用数组来存储数据
    Object[] elements;

    public MyStack() {
        elements = new Object[0];
    }

    // 压栈
    public void push(Object element) {
        // 创建一个新数组 ,长度为原数组长度加一
        Object[] newArr = new Object[elements.length + 1];
        // 将原数组中的数据复制到新数组
        for (int i = 0; i < elements.length; i++) {
            newArr[i] = elements[i];
        }
        // 把压入的元素放在数组的最后
        newArr[elements.length] = element;
        // 替换原数组
        elements = newArr;
    }

    // 取出栈顶元素
    public Object pop() {
        if (elements.length == 0) {
            throw new RuntimeException("stack is empty");
        }
        Object obj = elements[elements.length - 1];
        Object[] newArr = new Object[elements.length - 1];
        for (int i = 0; i < newArr.length; i++) {
            newArr[i] = elements[i];
        }
        // 替换原数组
        elements = newArr;
        return obj;
    }

    // 查看栈顶元素
    public Object peek() {
        if (elements.length == 0) {
            throw new RuntimeException("stack is empty");
        }
        return elements[elements.length - 1];
    }

    // 判断栈是否为空
    public boolean isEmpty() {
        return elements.length == 0;
    }
}
package demo2.test;

import demo2.MyStack;

public class TestMyStack {
    public static void main(String[] args) {
        MyStack m = new MyStack();
        m.push(5);
        m.push(6);
        m.push(7);
        Object t = m.pop();
        System.out.println(t.toString());

        Object t1 = m.pop();
        System.out.println(t1.toString());
        System.out.println(m.peek());
        System.out.println(m.isEmpty());
    }
}

 

  

 

posted @ 2020-04-07 09:42  已老  阅读(95)  评论(0)    收藏  举报