题解 | 括号配对问题

括号配对问题

https://www.nowcoder.com/practice/57260c08eaa44feababd05b328b897d7

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define N 10000


char* IsBracket(char *S)
{
    char *arr = (char *)malloc(sizeof(char) * N);
    if(arr == NULL)
    {
        return NULL;
    }

    int j = 0;
    for(int i = 0;S[i] != '\0';i++)
    {
        if(S[i] == '(' || S[i] == ')' || S[i] == '[' || S[i] == ']' || S[i] == '{' || S[i] == '}')
        {
            arr[j]  = S[i];
            j++;
        }
    }

    arr[j] = '\0';//注意得添加字符串结束符
    return arr;
}

char pairs(char a)
{
    if(a == ')')
    {
        return '(';
    }

    if(a == ']')
    {
        return '[';
    }

    if(a == '}')
    {
        return '{';
    }

    return 0;
}

bool IsLegal(char *s)
{
    if(s == NULL)
    {
        return true;
    }
    int len = strlen(s);

    if(len % 2 == 1)
    {
        return false;
    }

    //使用char数组作为栈
    char stk[len + 1];
    int top = 0;

    for(int i = 0;i < len;i++)
    {
        char ch = pairs(s[i]);
        if(ch)
        {
            if(top == 0 || stk[top - 1] != ch)
            {
                return false;
            }
            top--;
        }
        else
        {
            stk[top++] = s[i];
        }
    }
    return top == 0;
}


int main() {
    char S[N];

    if(scanf("%s",S) != 1)
    {
        printf("true");
        return 0;
    }

    char *newS = IsBracket(S);//指针接收,不用数组接收 char newS[N] = IsBracket(S);

    if(newS == NULL)
    {
        printf("true");
        return 0;
    }

    bool flag = IsLegal(newS);
    printf("%s",flag == 1 ? "true" : "false");

    free(newS);
    return 0;
}

全部评论

相关推荐

03-29 17:05
门头沟学院 Java
asdasdasda...:我前段时间找工作焦虑,有几天连续熬夜熬穿了,然后心脏突然不舒服,立马躺床上睡觉了,然后第二天还是不舒服,去看医生说是心率不齐,吓得我后面天天早早睡觉,调养身体,过了好几天才好过来。所以真的,工作这些东西哪有那么重要,最多钱多一点钱少一点,降低物欲。活着才是最重要的,现在想想真的后怕
如何排解工作中的焦虑
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务