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的十六进制表示的字符串。

posted @   xnmk  阅读(558)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
点击右上角即可分享
微信分享提示