【数据结构】栈

1.啥是栈

2.栈的使用

3.栈的自定义实现

4.划分栈,虚拟机栈,栈帧概念

(1)首先咱们来介绍一下什么是栈

Stack就是栈:栈是一种元素先进后出的一种数据结构

你可以把它想象成羽毛球筒,这是最直观的了:你拿一个空的羽毛球筒,往里面放羽毛球,假设你放入3个羽毛球,当你想从里面取出一个羽毛球的时候,不就是取的是最后放进去的那个羽毛球吗?第一个放进去的羽毛球被压在了最底部,也是最后才能拿到的羽毛球~

如上图,我要放入1  2  3  4  5  6 这几个元素,我按顺序先放入1  放入  2  再放入  3,现在3就在栈顶,1在栈低,我要是想从栈里取元素,首先取到的栈顶元素,而我想取到1的话,就得把1上面的元素先全部取完才能取到1,这就是说栈是一种先进后出的数据结构,1先放进去了,那就最后才能取,3最后放进去的,那么3就优先被取到 ~

上述就是关于栈的概念介绍


(2)接下来看看怎么在java中去使用栈

(图片来源:比特高博)

上图给出了栈的方法

接下来用代码测试一下(讲解写在注释中)

    public static void main(String[] args) {
        //创建栈
        Stack<Integer> stack = new Stack<>();
        //往栈里插入元素
        stack.push(1);
        stack.push(21);
        stack.push(13);
        stack.push(15);
        //获取栈顶元素
        System.out.println(stack.peek());
        //弹出栈顶元素
        System.out.println(stack.pop());
        //再次获取栈顶元素
        System.out.println(stack.peek());
        //判断此时栈是否为空
        System.out.println(stack.empty());
        //接下来把栈中剩下的元素再全部弹出
        stack.pop();
        stack.pop();
        stack.pop();
        //再次判断栈此时是否为空
        System.out.println(stack.empty());
        
        //该方法不是栈的方法,而是父类方法
        System.out.println(stack.size());//stack继承了vector,有父类方法
    }

 

 注意两个方法

(1)peek():这个方法是查看当前的栈顶元素,返回值为栈的元素,这个只是看一下,并没有动元素

(2)pop():这个方法是弹出(删除)栈顶元素,返回值也是栈的元素,这个是不仅看,还把元素给删除了

然后还有最后那个size()方法,这个不是Stack自带的,而是它继承了vector,是父类的方法~


(3)自定义实现一个栈

栈的底层是一个数组,所以栈是顺序储存的

public class MyStack {
    public int[] elem;
    public int usedSize;

    public static final int DEFAULT_CAPACITY = 10;

    public MyStack(){
        elem = new int[DEFAULT_CAPACITY];
    }

    public void push(int val){
        if(isFull()){
            elem = Arrays.copyOf(elem,elem.length*2);
        }
        elem[usedSize] = val;
        usedSize++;

    }
    public boolean isFull(){
        if(elem.length == usedSize) {
            return true;
        }else {
            return false;
        }
    }

    //删除栈顶元素
    public int pop(){
        if(empty()){
            throw new emptyStackException("栈为空了");
        }
        int oldVal = elem[usedSize-1];
        usedSize--;
        return oldVal;
    }

    //判断是否为空
    public boolean empty(){
        return usedSize == 0;
    }

    public int peek(){
        if(empty()){
            throw new emptyStackException("栈为空了");
        }
        return elem[usedSize-1];
    }
}

(4)区分栈,虚拟机栈,栈帧

栈:一种先进后出的数据结构

虚拟机栈:一块JVM内存,定义的局部变量,方法的开辟都存再虚拟机栈上

栈帧:但是方法的开辟出来的这块内存叫做栈帧


以上就是栈的简单介绍~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值