遍历文本文件时for循环提前终止问题及括号匹配优化咨询
括号匹配问题的循环错误分析与高效实现
一、for循环提前终止的原因
你的while循环和for循环逻辑存在关键差异:
- while循环:先判断
!input.isEmpty(),确认还有内容后再读取一行并处理,所有行都会被遍历处理,直到input为空。 - for循环:初始化时读取第一行,随后的循环条件是
!input.isEmpty()——当读取到最后一行后,input已经为空,循环条件不满足,最后一行的内容根本没进入循环体处理,导致提前终止。
修正后的for循环应该以readLine()返回值是否为null作为终止条件(读完所有内容后readLine()会返回null):
for (String s = input.readLine(); s != null; s = input.readLine()) { // 原处理逻辑 }
二、当前实现的不足
你现有的代码仅处理了圆括号(),未覆盖题目要求的方括号[]和花括号{},且按行读取的逻辑不符合“读取文本流”的要求(题目允许输入中一行包含多个括号字符)。
三、更高效的实现方案
核心优化点:
- 逐个字符处理文本流,而非按行读取
- 用HashMap存储右括号到左括号的映射,简化匹配逻辑
- 遇到不匹配的情况立即终止判断,避免无效处理
- 使用
char类型替代String,减少对象创建开销
完整实现代码:
import edu.princeton.cs.algs4.In; import edu.princeton.cs.algs4.StdOut; import java.util.HashMap; import java.util.Stack; public class Parentheses { public static void main(String[] args) { In input = new In("parenthesis.txt"); Stack<Character> stack = new Stack<>(); HashMap<Character, Character> bracketMap = new HashMap<>(); bracketMap.put(')', '('); bracketMap.put(']', '['); bracketMap.put('}', '{'); while (!input.isEmpty()) { char c = input.readChar(); // 左括号入栈 if (bracketMap.containsValue(c)) { stack.push(c); } // 处理右括号 else if (bracketMap.containsKey(c)) { // 栈空或栈顶不匹配,直接返回false if (stack.isEmpty() || stack.pop() != bracketMap.get(c)) { StdOut.println(false); return; } } // 非括号字符直接忽略 } // 最终栈空则括号平衡 StdOut.println(stack.isEmpty()); } }
优化说明:
- 映射表管理括号对:新增括号类型只需在HashMap中添加对应条目,代码扩展性更强
- 提前终止判断:一旦发现不匹配的情况(如右括号无对应左括号、括号类型不匹配),立即输出结果并退出,无需处理剩余输入
- 字符级处理:直接读取单个字符,符合题目“读取文本流”的要求,同时避免了String对象的频繁创建,提升效率
内容的提问来源于stack exchange,提问作者oresky
相关产品推荐
相关产品推荐

