You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历文本文件时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());
    }
}

优化说明:

  1. 映射表管理括号对:新增括号类型只需在HashMap中添加对应条目,代码扩展性更强
  2. 提前终止判断:一旦发现不匹配的情况(如右括号无对应左括号、括号类型不匹配),立即输出结果并退出,无需处理剩余输入
  3. 字符级处理:直接读取单个字符,符合题目“读取文本流”的要求,同时避免了String对象的频繁创建,提升效率

内容的提问来源于stack exchange,提问作者oresky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 02:57:04