数组实现栈的核心是用固定数组配合栈顶指针管理lifo操作:初始化top为-1,入栈先移动指针再赋值,出栈先取值再移动指针,操作前须判空判满;支持扩容、泛型处理及push/pop/peek/isempty/size五种基础方法。

用数组实现堆栈,核心是用一个固定底层数组配合一个“栈顶指针”来管理元素进出。它不依赖集合类,逻辑清晰、性能高,特别适合理解LIFO本质。
关键设计要点
栈顶指针(通常叫 top 或 usedSize)决定当前可操作位置:
- 初始化时设为 -1(表示空栈),或 0(表示下一个空位索引)——两种风格都常见,只要内部统一即可;
- 入栈时先移动指针再赋值(如
stackArray[++top] = value),或先赋值再移动(如stackArray[usedSize++] = value); - 出栈时先取值再移动指针(如
stackArray[top--]),确保返回的是原栈顶元素; - 所有操作前必须检查边界:入栈前判满(
top == maxSize - 1),出栈前判空(top == -1)。
支持动态扩容的写法
纯静态数组容量固定,但实际中常加入自动扩容机制,提升实用性:
- 当数组已满(
usedSize == elem.length),新建一个更大数组(如原长 ×2 或 +5); - 用
System.arraycopy()将原数据高效复制过去; - 更新引用和长度变量,后续操作无缝继续;
- 注意泛型数组需绕过类型擦除:声明为
T[] dataArr,创建时写(T[]) new Object[newCapacity]。
必须包含的基础方法
一个可用的数组栈至少提供以下五种能力:
- push(T value):添加元素到栈顶;
-
pop():移除并返回栈顶元素,空栈应返回
null或抛异常(不建议返回魔数如 -1); - peek():仅查看栈顶元素,不改变栈状态;
-
isEmpty():判断是否无元素,依据
top == -1或usedSize == 0; -
size():返回当前元素个数,直接返回
top + 1或usedSize。
与 Java 内存中“栈区”的区别
别混淆:这里说的是数据结构意义上的栈(Stack),不是 JVM 运行时内存划分里的“Java 栈(Java Virtual Machine Stack)”。后者用于存放方法调用帧、局部变量等,由 JVM 自动管理;而前者是你用 int[] 或 T[] 手动构造的逻辑结构,存在堆内存中。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











