• 【数据结构】栈


    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中去使用栈

    (图片来源:比特高博)

    上图给出了栈的方法

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

    1. public static void main(String[] args) {
    2. //创建栈
    3. Stack stack = new Stack<>();
    4. //往栈里插入元素
    5. stack.push(1);
    6. stack.push(21);
    7. stack.push(13);
    8. stack.push(15);
    9. //获取栈顶元素
    10. System.out.println(stack.peek());
    11. //弹出栈顶元素
    12. System.out.println(stack.pop());
    13. //再次获取栈顶元素
    14. System.out.println(stack.peek());
    15. //判断此时栈是否为空
    16. System.out.println(stack.empty());
    17. //接下来把栈中剩下的元素再全部弹出
    18. stack.pop();
    19. stack.pop();
    20. stack.pop();
    21. //再次判断栈此时是否为空
    22. System.out.println(stack.empty());
    23. //该方法不是栈的方法,而是父类方法
    24. System.out.println(stack.size());//stack继承了vector,有父类方法
    25. }

     

     注意两个方法

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

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

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


    (3)自定义实现一个栈

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

    1. public class MyStack {
    2. public int[] elem;
    3. public int usedSize;
    4. public static final int DEFAULT_CAPACITY = 10;
    5. public MyStack(){
    6. elem = new int[DEFAULT_CAPACITY];
    7. }
    8. public void push(int val){
    9. if(isFull()){
    10. elem = Arrays.copyOf(elem,elem.length*2);
    11. }
    12. elem[usedSize] = val;
    13. usedSize++;
    14. }
    15. public boolean isFull(){
    16. if(elem.length == usedSize) {
    17. return true;
    18. }else {
    19. return false;
    20. }
    21. }
    22. //删除栈顶元素
    23. public int pop(){
    24. if(empty()){
    25. throw new emptyStackException("栈为空了");
    26. }
    27. int oldVal = elem[usedSize-1];
    28. usedSize--;
    29. return oldVal;
    30. }
    31. //判断是否为空
    32. public boolean empty(){
    33. return usedSize == 0;
    34. }
    35. public int peek(){
    36. if(empty()){
    37. throw new emptyStackException("栈为空了");
    38. }
    39. return elem[usedSize-1];
    40. }
    41. }

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

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

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

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


    以上就是栈的简单介绍~

  • 相关阅读:
    【反编译系列】二、反编译 .pyc 文件(uncompyle6)
    汽车级全保护型六路半桥驱动器NCV7708FDWR2G 原理、参数及应用
    数据处理软件介绍(PIX4D和MAOIHPHO)
    密码学与加密算法详解
    多线程(pthread库)
    信号生成和可视化
    HCIP —— BGP路径属性 (下)
    AutoGPT:让 AI 帮你完成任务事情 | 开源日报 No.54
    BottomNavigation 底部导航模版
    fastadmin tp 安装使用百度富文本编辑器UEditor
  • 原文地址:https://blog.csdn.net/qq_61862008/article/details/127936566