c语言字符串括号匹配


bool isValid(char* s ) {
    // write code here
    int i=0;
    int len=strlen(s);
    if(len%2==1)
    return false;
    for(i=0;i<len-1;i++)
    {
        if(s[i]==')'||s[i]==']'||s[i]=='}')
                 return false;
        switch(s[i])
        {
            case '(':
                if(s[i+1]==')')
                i++;
                else
                return false;
            case '[':
                if(s[i+1]==']')
                i++;
                else
                return false;
            case '{':
                if(s[i+1]=='}')
                i++;
                else
                return false;
            default:return false;
        }
    }
    return true;
}

题目为:

img

合法true
我的思路:字符串长度为奇数肯定不合法,从0开始,当该字符为左括号时,判断下一个字符是否为右括号,若是,则跳过下一个字符直接到下一个左括号,若不是,则直接返回false

以上代码有以下问题:
1 对于含有右括号的字符串,直接返回false,这是错误的,因为有可能在后面的部分中有与之匹配的左括号。

2 在switch语句中,每个case后面都应该有break语句,否则会出现执行下一个case的情况。例如,输入为"[]{}()"时,代码会返回false,因为当遇到左括号时,执行匹配成功后的语句后,会继续执行下一个case,而不是直接跳出switch语句。

3 在switch语句中,默认情况下应该返回false,因为如果不是左括号或右括号,那么它一定不符合括号序列的规则。

4 输入为空串时,应该返回true。

可以考虑用栈来解决问题,遇到左括号就入栈,遇到右括号就与栈顶元素匹配,如果匹配成功就把栈顶元素出栈。如果遍历完成后栈为空,则说明括号序列合法。希望能帮到你

bool isValid(char* s) {
    int len = strlen(s);
    if (len % 2 == 1) {
        return false;
    }

    char stack[len];
    int top = 0;

    for (int i = 0; i < len; i++) {
        switch (s[i]) {
            case '(':
            case '[':
            case '{':
                stack[top++] = s[i];
                break;
            case ')':
                if (top == 0 || stack[--top] != '(') {
                    return false;
                }
                break;
            case ']':
                if (top == 0 || stack[--top] != '[') {
                    return false;
                }
                break;
            case '}':
                if (top == 0 || stack[--top] != '{') {
                    return false;
                }
                break;
            default:
                return false;
        }
    }
    return top == 0;
}


  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7531888
  • 这篇博客你也可以参考下:不能修改C盘下文件(提示没有所需特权或无法访问)
  • 除此之外, 这篇博客: 判断某一年天数的问题中的 —以前写关于年数天数的算法都是用各种if语句判来判去的,没有想过简化一下,昨天看了打鱼还是晒网的的算法,发现了一段简练清晰的代码(一下是c语言代码,不过思想是普遍适用的) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

  • int days(struct date day) { 
    //这里首先定义一个关于闰年和非闰年每一个月天数的二维数组
        const int month_days[2][13] = {{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},     //非闰年每一个月的天数
                                                    {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};    //闰年每一个月的天数
        int i, lp=0; 
        if(day.year%4 == 0 && day.year %100!=0 || day.year%400 == 0)  lp=1;   //lp用来判断是否闰年
        ...                             
    }

  • 您还可以看一下 刘城龙老师的教你快速查找电脑中的文件课程中的 快速按文件内容查找文件的方法小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    我可以给您一些改进建议: 1.您的算法只能判断括号的数量是否匹配,但不能判断括号的顺序是否匹配。例如,"(([]))"和"([)]"都有相同数量的括号,但是后者的括号顺序不匹配,应该判定为不匹配。因此,您需要使用栈来保存左括号,在扫描到右括号时,弹出栈顶元素比较是否匹配。 2.使用gets函数可以导致缓冲区溢出和安全问题,应该使用fgets函数。 3.对于输入字符串的长度,最好使用strlen函数获取其长度而不是遍历整个字符串。 下面是一个实现字符串括号匹配的C程序:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAXLEN 1000
    
    typedef struct stack {  // 定义一个栈结构体
        char data[MAXLEN];  // 最多存储MAXLEN个字符
        int top;  // 栈顶指针
    } Stack;
    
    void initStack(Stack *s) {  // 初始化栈
        s->top = -1;
    }
    
    void push(Stack *s, char c) {  // 将元素入栈
        s->top++;
        s->data[s->top] = c;
    }
    
    char pop(Stack *s) {  // 将栈顶元素弹出
        char temp = s->data[s->top];
        s->top--;
        return temp;
    }
    
    int isEmpty(Stack *s) {  // 判断栈是否为空
        return s->top == -1;
    }
    
    int isMatch(char c1, char c2) {  // 判断两个括号是否匹配
        return (c1 == '(' && c2 == ')') || (c1 == '[' && c2 == ']') || (c1 == '{' && c2 == '}');
    }
    
    int isValid(char *s) {
        int len = strlen(s);  // 计算字符串长度
        if (len % 2)  // 如果字符串长度为奇数直接返回不匹配
            return 0;
        Stack s1;
        initStack(&s1);  // 初始化栈
        for (int i = 0; i < len; i++) {
            if (s[i] == '(' || s[i] == '[' || s[i] == '{')  // 如果是左括号入栈
                push(&s1, s[i]);
            else if (s[i] == ')' || s[i] == ']' || s[i] == '}') {  // 如果是右括号
                if (isEmpty(&s1) || !isMatch(pop(&s1), s[i]))  // 如果栈为空或者栈顶元素与当前元素不匹配
                    return 0;  // 返回不匹配
            }
        }
        if (!isEmpty(&s1))  // 如果栈不为空
            return 0;  // 返回不匹配
        return 1;  // 括号匹配成功
    }
    
    int main() {
        char s[MAXLEN];
        printf("输入一个字符串:");
        fgets(s, MAXLEN, stdin);  // 输入字符串使用fgets函数
        s[strcspn(s, "\n")] = '\0';  // 去除fgets函数输入的换行符
        if (isValid(s))
            printf("括号匹配成功!\n");
        else
            printf("括号匹配失败!\n");
        return 0;
    }