Basic Recursion, Check Balanced Parenthesis

前端 未结 12 1206
孤独总比滥情好
孤独总比滥情好 2020-11-29 17:56

I\'ve written software in the past that uses a stack to check for balanced equations, but now I\'m asked to write a similar algorithm recursively to check for properly neste

12条回答
  •  情深已故
    2020-11-29 18:09

    There are many ways to do this, but the simplest algorithm is to simply process forward left to right, passing the stack as a parameter

    FUNCTION isBalanced(String input, String stack) : boolean
      IF isEmpty(input)
        RETURN isEmpty(stack)
      ELSE IF isOpen(firstChar(input))
        RETURN isBalanced(allButFirst(input), stack + firstChar(input))
      ELSE IF isClose(firstChar(input))
        RETURN NOT isEmpty(stack) AND isMatching(firstChar(input), lastChar(stack))
          AND isBalanced(allButFirst(input), allButLast(stack))
      ELSE
        ERROR "Invalid character"
    

    Here it is implemented in Java. Note that I've switched it now so that the stack pushes in front instead of at the back of the string, for convenience. I've also modified it so that it just skips non-parenthesis symbols instead of reporting it as an error.

    static String open  = "([<{";
    static String close = ")]>}";
    
    static boolean isOpen(char ch) {
        return open.indexOf(ch) != -1;
    }
    static boolean isClose(char ch) {
        return close.indexOf(ch) != -1;
    }
    static boolean isMatching(char chOpen, char chClose) {
        return open.indexOf(chOpen) == close.indexOf(chClose);
    }
    
    static boolean isBalanced(String input, String stack) {
        return
            input.isEmpty() ?
                stack.isEmpty()
            : isOpen(input.charAt(0)) ?
                isBalanced(input.substring(1), input.charAt(0) + stack)
            : isClose(input.charAt(0)) ?
                !stack.isEmpty() && isMatching(stack.charAt(0), input.charAt(0))
                  && isBalanced(input.substring(1), stack.substring(1))
            : isBalanced(input.substring(1), stack);
    }
    

    Test harness:

        String[] tests = {
            "()[]<>{}",
            "(<",
            "]}",
            "()<",
            "(][)",
            "{(X)[XY]}",
        };
        for (String s : tests) {
            System.out.println(s + " = " + isBalanced(s, ""));
        }
    

    Output:

    ()[]<>{} = true
    (< = false
    ]} = false
    ()< = false
    (][) = false
    {(X)[XY]} = true
    

提交回复
热议问题