Stack

供自己巩固集合知识时写的笔记,不会对所有的内容都介绍
栈(Stack)是一种后进先出(LIFO:Last In First Out)的数据结构

Stack只有入栈和出栈的操作:

  • 把元素压栈: push(E)
  • 把栈顶的元素”弹出”: pop()
  • 取栈顶元素但不弹出: peek()

有的人在使用 Stack时会发现, Stack没有单独的接口。因为有个遗留类名字就叫 Stack,出于兼容性考虑,所以没办法创建 Stack接口。

Stack的作用

Stack在计算机中使用非常广泛,JVM在处理Java方法调用的时候就会通过栈这种数据结构维护方法调用的层次。例如:

static void main(String[] args) {
    foo(123);
}

static String foo(x) {
    return "F-" + bar(x + 1);
}

static int bar(int x) {
    return x << 2;
}

JVM会创建方法调用栈,每调用一个方法时,先将参数压栈,然后执行对应的方法;当方法返回时,返回值压栈,调用方法通过出栈操作获得方法返回值。

因为方法调用栈有容量限制,嵌套调用过多会造成栈溢出,即引发 StackOverflowError

public class Main {
    public static void main(String[] args) {
        increase(1);
    }

    static int increase(int x) {
        return increase(x) + 1;
    }
}

我们再来看一个 Stack的用途:对整数进行进制的转换就可以利用栈。

例如,我们要把一个 int整数 12500转换为十六进制表示的字符串:

先我们准备一个空栈:

│   │
│   │
│   │
│   │
│   │
│   │
│   │
│   │
└───┘

然后计算12500÷16=781…4,余数是 4,把余数 4压栈:

│   │
│   │
│   │
│   │
│   │
│   │
│   │
│ 4 │
└───┘

然后计算781÷16=48…13,余数是 1313的十六进制用字母 D表示,把余数 D压栈:

│   │
│   │
│   │
│   │
│   │
│ D │
│   │
│ 4 │
└───┘

然后计算48÷16=3…0,余数是 0,把余数 0压栈:

│   │
│   │
│   │
│ 0 │
│   │
│ D │
│   │
│ 4 │
└───┘

最后计算3÷16=0…3,余数是 3,把余数 3压栈:

│   │
│ 3 │
│   │
│ 0 │
│   │
│ D │
│   │
│ 4 │
└───┘

当商是 0的时候,计算结束,我们把栈的所有元素依次弹出,组成字符串 30D4,这就是十进制整数 12500的十六进制表示的字符串。

Original: https://www.cnblogs.com/xnmk-zhan/p/15547443.html
Author: xnmk
Title: Stack

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/590685/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球