解释:(其中startIndex 命名应该为 startCount)

原理就是利用Stack的 后进先出的 特性

通过正则查找  要找的左括号对应的右括号 其中左括号是第几个(startIndex )括号

将字串变成char数组,循环并记录左括号出现的次数(appearCount )每循环一次次数+1,

然后对比startIndex 是否等于appearCount 

如果相等则在栈中添加一个标记 * (胎记),不相等则将当前char[i]插入栈中

然后继续循环,如果遇到右括号

使用.pop() 方法,移除堆栈顶部的对象,并作为此函数的值返回该对象 popChar 。
然后判断 popChar 是否为标记的 * 号

如果是 * 号 则证明此 右括号-取名“小右”对应的括号是 “小左” 

根据括号的起始位置,找到对应括号的位置_经验分享

 根据括号的起始位置,找到对应括号的位置_经验分享_02

 根据括号的起始位置,找到对应括号的位置_经验分享_03

 根据括号的起始位置,找到对应括号的位置_经验分享_04

  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;
    }