蹲家宅宅 2023-08-26 16:52 采纳率: 52%
浏览 7
已结题

C语言:用栈来检查括号的匹配

C语言:用栈来检查括号的匹配
以下代码哪里出错了,如何改正?

#include<stdio.h>
#define max_size 21
typedef struct 
{
    char data[max_size];
    int top;
}stack;
int isleft(char c){
    int ret;
    switch (c)
    {
    case '[':
    case '{':
        ret = 1;
        break;
    default:
        ret = 0;
        break;
    }
    return ret;
}
int isright(char c){
    int ret;
    switch (c)
    {
    case ']':
    case '}':
        ret = 1;
        break;
    default:
        ret = 0;
        break;
    }
    return ret;
}
int check(char left,char right){
    int ret = 0;
    switch (left)
    {
    case '[':
        if (right == ']')
        {
            ret = 1;
        }
        break;
    case '{':
        if (right == '}')
        {
            ret = 1;
        }
        break;
    default:
    ret = 0;
        break;
    }
    return ret;
}
int scanner(char *str){
    stack *s;
    int i = 0;
    int ret = 1;
    char c;
    while (str[i] != '\0')
    {
        if (isleft(str[i]))
        {
            s->data[++s->top] = str[i];
        }
        if (isright(str[i]))
        {
            if (s->data[s->top] == '\0')
            {
                ret = 0;
                return ret;
            }
            else
            {
                c = s->data[s->top];
                if (check(str[i-1],c))
                {
                    s->top--;
                }else{
                    ret = 0;
                    return ret;
                }
            }
        }
        i++;
    }  
    return ret;
}
int main(){
    char str[max_size];
    printf("请输入一段符号:");
    fgets(str,sizeof(str)/sizeof(str[0]),stdin);
    if (scanner(str) == 1)
    {
        printf("balance\n");
    }else{
        printf("no balance\n");
    }
    
}


  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-26 20:13
    关注

    【以下回答由 GPT 生成】

    问题分析: 1. 在函数scanner中,stack指针s没有被初始化,导致在对s进行操作时出现错误。 2. 函数stack并没有被调用,因此需要添加代码来创建和释放栈。 3. 函数参数类型为char *的指针,但是在主函数中没有传入字符串,因此需要在主函数中调用scanner函数并传入字符串。 4. 没有包含头文件string.h,导致编译错误。 5. 没有包含头文件stdlib.h,导致编译错误。

    修改建议:

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    #define max_size 21
    
    typedef struct 
    {
        char data[max_size];
        int top;
    }stack;
    
    stack* create_stack(){
        stack* s = (stack*)malloc(sizeof(stack));
        s->top = -1;
        return s;
    }
    
    void destroy_stack(stack* s){
        free(s);
    }
    
    int isleft(char c){
        int ret;
        switch (c)
        {
        case '[':
        case '{':
            ret = 1;
            break;
        default:
            ret = 0;
            break;
        }
        return ret;
    }
    
    int isright(char c){
        int ret;
        switch (c)
        {
        case ']':
        case '}':
            ret = 1;
            break;
        default:
            ret = 0;
            break;
        }
        return ret;
    }
    
    int check(char left, char right){
        int ret = 0;
        switch (left)
        {
        case '[':
            if (right == ']')
            {
                ret = 1;
            }
            break;
        case '{':
            if (right == '}')
            {
                ret = 1;
            }
            break;
        default:
            ret = 0;
            break;
        }
        return ret;
    }
    
    int scanner(char *str){
        stack* s = create_stack();
        int i = 0;
        int ret = 1;
        char c;
        while (str[i] != '\0')
        {
            c = str[i];
            if (isleft(c))
            {
                s->top++;
                s->data[s->top] = c;
            }
            else if (isright(c))
            {
                if (s->top == -1 || !check(s->data[s->top], c))
                {
                    ret = 0;
                    break;
                }
                else
                {
                    s->top--;
                }
            }
            i++;
        }
        if (s->top != -1)
        {
            ret = 0;
        }
        destroy_stack(s);
        return ret;
    }
    
    int main(){
        char str[] = "{[()]}";
        int result = scanner(str);
        printf("括号匹配结果:%d\n", result);
        return 0;
    }
    


    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月27日
  • 已采纳回答 8月27日
  • 创建了问题 8月26日

悬赏问题

  • ¥15 陆空双模式无人机怎么做
  • ¥15 想咨询点问题,与算法转换,负荷预测,数字孪生有关
  • ¥15 C#中的编译平台的区别影响
  • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
  • ¥15 电脑蓝屏logfilessrtsrttrail问题
  • ¥20 关于wordpress建站遇到的问题!(语言-php)(相关搜索:云服务器)
  • ¥15 【求职】怎么找到一个周围人素质都很高不会欺负他人,并且未来月薪能够达到一万以上(技术岗)的工作?希望可以收到写有具体,可靠,已经实践过了的路径的回答?
  • ¥15 Java+vue部署版本反编译
  • ¥100 对反编译和ai熟悉的开发者。
  • ¥15 带序列特征的多输出预测模型