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");
    }
    
}


【以下回答由 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;
}


【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

你这没有初始化直接用了

img

下面的i-1 改成i

img


而且没有考虑栈为空的情况