Java中使用栈检测重复括号的代码错误排查
问题分析与修复
原代码的核心问题是条件分支逻辑混乱,导致循环刚启动就会触发else分支直接返回true:
- 当遍历到非
)的字符时(比如第一个字符(),第一个if会将字符压入栈,但紧接着第二个if条件不成立,直接进入关联的else分支返回true,完全没走完正常逻辑。 - 此外,原代码没有处理**遇到
)且栈顶就是(**的场景——这才是重复括号的判定核心条件。
修正后的代码
import java.util.Stack; public class DuplicatePar { public static void main(String[] args) { String str1 = "((a+b)+c)"; // 无重复括号,返回false String str2 = "((a+b))+c"; // 有重复括号,返回true System.out.println(dupliPar(str1)); System.out.println(dupliPar(str2)); } public static boolean dupliPar(String str) { Stack<Character> s = new Stack<>(); for (int i = 0; i < str.length(); i++) { char ch = str.charAt(i); // 仅遇到右括号时做特殊处理,其他字符直接压栈 if (ch == ')') { // 栈顶就是左括号,说明中间无内容,属于重复括号 if (s.peek() == '(') { return true; } // 弹出左括号之前的所有内容 while (s.peek() != '(') { s.pop(); } // 弹出匹配的左括号 s.pop(); } else { s.push(ch); } } // 遍历结束未发现重复括号 return false; } }
关键逻辑说明
- 只在遇到
)时执行匹配判断,其余字符直接入栈。 - 遇到
)后先检查栈顶:- 若栈顶是
(,说明这对括号中间没有任何有效内容,判定为重复括号,直接返回true。 - 若栈顶不是
(,则持续弹出元素直到找到对应的(,再弹出该(完成正常括号匹配。
- 若栈顶是
- 遍历完整个字符串未找到重复括号,返回
false。
内容的提问来源于stack exchange,提问作者SBM
相关产品推荐
相关产品推荐

