Java检查平衡括号

时间:2014-01-16 18:18:12

标签: java

我需要编写一个程序来检查括号是否平衡,我知道该怎么做并且已经实现了。但是,还有第二部分我遇到了麻烦, “如果字符串没有正确嵌套和平衡,则给出一个返回第一个引起括号的字符串中位置的算法。也就是说,如果找到一个多余的右括号,则返回其位置;如果左括号太多,则返回第一个多余的左括号的位置。“

我们还没有了解堆栈或正则表达式,所以我无法利用它们。下面是我的实现,以检查嵌套括号是否平衡。

public static int checkNest(char[] arr) {
    int counter = 0,index = 0;
    for(int i=0; i<arr.length; i++) {
        if(arr[i] == '(')
            counter++;
        else if(arr[i] == ')')
            counter--;
    }
    if(counter == 0)
        index = -1;
    return index;
}

现在不正确的索引将始终为0,我需要操纵我的代码以正确显示不正确的括号的索引。

3 个答案:

答案 0 :(得分:0)

通常,当您有多个括号类型时,必须使用Stack。您只有一个错误:发现反括号时,应保持反调并增加反斜率;反之,则应减少反斜率。当计数器在迭代的任何步骤均为负数时-则不平衡。

public static boolean isBalanced(String str) {
    Deque<Character> stack = new LinkedList<>();

    for (int i = 0; i < str.length(); i++) {
        char ch = str.charAt(i);

        if (ch == '(' || ch == '[' || ch == '{')
            stack.push(ch);
        else {
            if (stack.isEmpty())
                return false;

            char prv = stack.pop();

            if (prv == '(' && ch != ')')
                return false;
            if (prv == '[' && ch != ']')
                return false;
            if (prv == '{' && ch != '}')
                return false;
        }
    }

    return stack.isEmpty();
}

如果您只有一种类型的括号,那么您可能只有一个计数器:

public static boolean isBalanced(String str) {
    int count = 0;

    for (int i = 0; i < str.length() && count >= 0; i++) {
        if (str.charAt(i) == '(')
            count++;
        else if (str.charAt(i) == ')')
            count--;
    }

    return count == 0;
}

答案 1 :(得分:0)

public static int checkNest(char[] arr) {
    int counter = 0,index = 0;
    for(int i=0; i<arr.length; i++) {
        // Only one incorrect parentheses. 
        index = i;
        if(arr[i] == '(')
            counter++;
        else if(arr[i] == ')')
            counter--;
    }
    if(counter == 0)
        index = -1;
    return index;
}

答案 2 :(得分:0)

对于额外的右括号,如果计数器为零,您可以立即返回i的当前值,但是对于额外的左括号,您必须继续解析字符串直到结尾,因此必须记住counter==0中最后一个左括号的位置:

public static int checkNest(char[] arr) {
    int counter = 0,index = -1;
    for(int i=0; i<arr.length; i++) {
        if(arr[i] == '(') {
            if (counter == 0) {
                index = i;
            }
            counter++;
        } else if(arr[i] == ')') {
            if (counter == 0) {
                return i;
            }
            counter--;
        }
    }
    if (counter == 0) {
        return -1;
    }
    return index;
}