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,余数是13
,13
的十六进制用字母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
的十六进制表示的字符串。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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上本地化部署