Basic Recursion, Check Balanced Parenthesis

前端 未结 12 1234
孤独总比滥情好
孤独总比滥情好 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:18

    First, to your original question, just be aware that if you're working with very long strings, you don't want to be making exact copies minus a single letter each time you make a function call. So you should favor using indexes or verify that your language of choice isn't making copies behind the scenes.

    Second, I have an issue with all the answers here that are using a stack data structure. I think the point of your assignment is for you to understand that with recursion your function calls create a stack. You don't need to use a stack data structure to hold your parentheses because each recursive call is a new entry on an implicit stack.

    I'll demonstrate with a C program that matches ( and ). Adding the other types like [ and ] is an exercise for the reader. All I maintain in the function is my position in the string (passed as a pointer) because the recursion is my stack.

    /* Search a string for matching parentheses.  If the parentheses match, returns a
     * pointer that addresses the nul terminator at the end of the string.  If they
     * don't match, the pointer addresses the first character that doesn't match.
     */
    const char *match(const char *str)
    {
            if( *str == '\0' || *str == ')' ) { return str; }
            if( *str == '(' )
            {
                    const char *closer = match(++str);
                    if( *closer == ')' )
                    {
                            return match(++closer);
                    }
                    return str - 1;
            }
    
            return match(++str);
    }
    

    Tested with this code:

        const char *test[] = {
                "()", "(", ")", "", "(()))", "(((())))", "()()(()())",
                "(() ( hi))) (())()(((( ))))", "abcd"
        };
    
        for( index = 0; index < sizeof(test) / sizeof(test[0]); ++index ) {
                const char *result = match(test[index]);
    
                printf("%s:\t", test[index]);
                *result == '\0' ? printf("Good!\n") :
                        printf("Bad @ char %d\n", result - test[index] + 1);
        }
    

    Output:

    (): Good!
    (:  Bad @ char 1
    ):  Bad @ char 1
    :   Good!
    (())):      Bad @ char 5
    (((()))):   Good!
    ()()(()()): Good!
    (() ( hi))) (())()(((( )))):    Bad @ char 11
    abcd:       Good!
    

提交回复
热议问题