【Java 入门】栈的核心应用与基础语法全梳理
一、核心知识点总览
今天围绕「栈(Stack)」这个核心数据结构,系统学习了其基础用法、实际应用场景,以及配套的 Java 基础语法,重点覆盖:
- 栈的核心特性与常用 API
- 字符串处理(分割、类型转换、字符提取)
- 合法括号序列判断(栈的经典实战)
- Java 输入输出与基础语法细节
二、栈(Stack)核心知识点
1. 栈的本质特性
- 后进先出(LIFO) :最后入栈的元素最先出栈
- 栈顶:最后入栈的元素所在位置(操作的唯一出入口)
-
- 示例:依次 push (1)、push (2)、push (3) → 栈为[1,2,3],3 是栈顶;pop () 后弹出 3,2 成为新栈顶
2. Java Stack 类核心 API(均为 JDK 自带)
| 方法 | 功能 | 注意事项 |
|---|---|---|
| push(x) | 将元素 x 入栈(压入栈顶) | 无返回值,仅完成入栈操作 |
| pop() | 弹出栈顶元素(删除并返回) | 栈空时调用会抛出 EmptyStackException |
| peek() | 获取栈顶元素(不删除) | 栈空时调用会抛出 EmptyStackException |
| isEmpty() | 判断栈是否为空,返回 boolean | 优先用于空栈判断,避免异常 |
| size() | 返回栈中元素数量 | 等价于isEmpty() == (size() == 0) |
三、字符串处理基础
1. 字符串分割与提取
- String.split("分隔符"):按指定分隔符拆分字符串为数组
-
- 示例:"push 100".split(" ") → ["push", "100"]
- String.charAt(i):获取字符串第 i 个字符(下标从 0 开始)
- 非括号字符过滤:遍历字符串,仅保留()/[],忽略其他字符
2. 类型转换
| 场景 | 方法 | 示例 |
|---|---|---|
| 字符串转整数 | Integer.parseInt(字符串) | Integer.parseInt("100") → 100 |
| 整数转字符串 | String.valueOf(数字) | String.valueOf(100) → "100" |
| 超大数字转换 | Long.parseLong(字符串) | 处理超出 int 范围的数字 |
四、经典实战:合法括号序列判断
1. 核心逻辑(栈的典型应用)
// 1. 提取所有括号字符(忽略其他字符)
// 2. 遍历括号序列:
// - 左括号((、[)→ 入栈
// - 右括号()、])→ 检查栈是否为空 + 栈顶是否匹配
// 3. 遍历结束后,栈必须为空(无剩余左括号)
2. 关键判定规则
- 右括号必须匹配「最近的」左括号()配(,]配[)
- 栈空时遇到右括号 → 直接不合法
- 遍历结束栈非空 → 有未匹配的左括号 → 不合法
五、Java 基础语法细节
1. 输入处理
- Scanner.nextLine():读取整行输入(含空格),需注意nextInt()后残留换行符的处理
- Scanner.close():关闭输入流,释放资源
2. 高效字符拼接
- StringBuilder:循环拼接字符时优先使用,避免 String 不可变导致的性能损耗
3. 分支 / 循环
- switch:多分支场景替代if-else,代码更简洁
- 循环终止:break可直接退出循环,减少无效遍历
六、新手避坑指南
- 空栈操作:执行pop()/peek()前必须用isEmpty()判断
- 类型转换:Integer.parseInt()仅支持纯数字字符串,含非数字字符会抛异常
- 数组下标:Java 数组下标从 0 开始,parts[1]是分割后的第二个元素
- 括号匹配:严格区分()和[],不能交叉匹配(如[(])不合法)
总结
今天的核心是「栈的后进先出特性」+「字符串处理」+「合法括号判断逻辑」,栈作为基础数据结构,是解决括号匹配、表达式求值等问题的核心工具;同时掌握 Java 字符串操作、类型转换等基础语法,能有效提升代码的健壮性和可读性。