解释:(其中startIndex 命名应该为 startCount)
原理就是利用Stack的 后进先出的 特性
通过正则查找 要找的左括号对应的右括号 其中左括号是第几个(startIndex )括号
将字串变成char数组,循环并记录左括号出现的次数(appearCount )每循环一次次数+1,
然后对比startIndex 是否等于appearCount
如果相等则在栈中添加一个标记 * (胎记),不相等则将当前char[i]插入栈中
然后继续循环,如果遇到右括号
使用.pop() 方法,移除堆栈顶部的对象,并作为此函数的值返回该对象 popChar 。
然后判断 popChar 是否为标记的 * 号
如果是 * 号 则证明此 右括号-取名“小右”对应的括号是 “小左”
public static void main(String[] args) {
String formula = "(1{2{3}2}1)";
Integer ifWhereListStartIndex = formula.indexOf("{");
Integer index = bracketsMatchedSearchByLeft(formula.toCharArray(),ifWhereListStartIndex);
System.out.println(index);
}
/**
* 通过左括号的位置得到匹配的右括号的位置
* <p>
* 返回对应坐标为正常,
* -1表示传进来的坐标不是左括号
* -2表示不存在对应右括号(不应该出现,应该提前校验过括号配对)
*
* @param checkedCharArray
* @param leftIndex
* @return
*/
public static Integer bracketsMatchedSearchByLeft(char[] checkedCharArray, int leftIndex) {
// 校验传进来的数组和索引是否为合法
if (checkedCharArray.length < leftIndex || leftIndex < 0) {
return -1;
}
char left = checkedCharArray[leftIndex];
// 非左括号或空格
if (!('(' == left || '{' == left)) {
return -1;
}
/*
* 获取传进来的是第几个左括号
*/
int startIndex = 0;
Matcher matcher = Pattern.compile("\\(|\\{").matcher(new String(checkedCharArray));
while (matcher.find()) {
startIndex++;
if (matcher.start() == leftIndex) {
break;
}
}
/*
* 获取另一配对括号位置
*/
Stack<Character> bracketsStack = new Stack<Character>();
int appearCount = 0;
for (int i = 0; i < checkedCharArray.length; i++) {
char c = checkedCharArray[i];
// 左括号都压入栈顶,右括号进行比对
if (c == '(' || c == '{') {
appearCount++;
// 如果是目标,就插入*作为标记
if (startIndex == appearCount) {
bracketsStack.push('*');
} else {
bracketsStack.push(c);
}
// System.out.println("栈内容:" + bracketsStack);
} else if (c == ')' || c == '}') {
// 栈非空校验,防止首先出现的是右括号
if (bracketsStack.isEmpty()) {
return -2;
}
Character popChar = bracketsStack.pop();
if ('*' == popChar) {
return i;
}
}
}
return -2;
}