用数组实现栈的核心是用top变量跟踪栈顶位置:top指向下一个空位时初始化为0,push后top加1,pop前检查top>0再减1返回arr[top-1];top指向栈顶元素时初始化为-1,push先++再赋值,pop先取值再--,需严防越界。

用数组实现栈,核心是用一个整型变量(通常叫 top)来跟踪栈顶位置。它不存数据,只记“下一个空位在哪”或“当前最上面元素的下标”,理解这个指针逻辑,压入(push)和弹出(pop)就自然清晰了。
top 指向下一个空位:推荐初学者的方式
初始化时 top = 0,表示栈为空,第一个元素该放在索引 0;每次 push 后 top 加 1;pop 前先检查 top > 0,再让 top 减 1,然后返回原 top−1 位置的值。
- 优点:边界判断直观(空栈 → top == 0;满栈 → top == capacity)
- push 示例:arr[top] = x; top++;
- pop 示例:top--; return arr[top];(注意先减后取)
top 指向栈顶元素:更贴近“栈顶”字面意思
初始化时 top = −1,表示无元素;push 时先 top++,再赋值;pop 时先取 arr[top],再 top−−。
- 优点:top 始终对应真实存在的栈顶元素(只要栈非空)
- 缺点:空栈时 top 为 −1,容易引发越界,需格外注意判空
- 常见错误:pop 不判空直接 top−−,导致 top 变成 −2,后续 push 可能覆盖非法内存
容量检查与安全操作不能省
数组大小固定,必须在 push 前判断是否已满(top == capacity 或 top == arr.length),在 pop 前判断是否为空(top == 0 或 top == −1)。否则程序可能崩溃或静默出错。
- 建议统一返回布尔值表示操作成功与否,比如 boolean push(int x)
- 调试时可加打印:System.out.println("Current top: " + top);
为什么不用“自动扩容数组”?先吃透静态逻辑
动态扩容(如转成 ArrayList)会掩盖指针移动的本质。初学重点不是功能多强大,而是清楚每一步:数据放哪、top 怎么变、什么条件下允许操作。等 top 的增减时机和含义完全内化,再封装 resize 才水到渠成。
不复杂但容易忽略——关键不在代码长短,而在 top 每一次自增自减背后代表的逻辑状态。

















