【问题标题】:Parentheses checker in c using stacks of arrays not producing correct output everytimec中的括号检查器使用数组堆栈每次都不会产生正确的输出
【发布时间】:2019-02-26 14:10:12
【问题描述】:

我尝试使用数组堆栈在 c 中编写一个括号检查器。该代码不会给出错误消息,但有时会给出正确的输出,有时会给出错误的输出。 非常感谢我如何改进代码或任何其他建议。我是初学者 C 程序员。 我试图将输入作为字符串但无法做到。有什么建议吗?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX 25

    int top = -1;
    char stack[MAX];

    void push(char x)
    {
        if(top == MAX - 1){
        printf("Stack Overflow\n");
        return;
       }
        stack[++top] = x;
    }

    char pop()
    {
        char popped;
        if(top == -1) {
        printf("Stack Underflow\n");
        return 0;
        }
    popped = stack[top];
    --top;
    return popped;
    }
        char Top()
    {
        return (stack[top]);

    }
int arePair(char opening,char closing)
{
    if(opening =='(' && closing == ')') return 1;
    else if((opening =='{' && closing == '}')) return 1;
    else if (opening =='[' && closing == ']') return 1;
    return 0;
}

    int paranthesesBalanced(char *exp,int size)
    {
       for (int i=0;i<size;i++)
       {
    if(exp[i] == '(' || exp[i] == '{' || exp[i] == '[')
            push(exp[i]);
        else if (exp[i] == ')' || exp[i] == '}'|| exp[i] == ']') 
        {
            if(top == -1 || !arePair(Top(),exp[i]))
            return 0;
            else
            pop();
        }

           }
            return (top == -1 ? 1:0);

    }


    int main()
    {
        char exp[25];
        int size=0;
        printf("Enter the size of 
    expression\n");
        scanf("%d",&size);
        printf("Enter the expression(Less than 
    25 characters): \n");
        //scanf("%[ˆ\n]%",exp);
        for (int i=0;i<size;i++)
       {
       scanf("%c",&exp[i]);
       }
        if(paranthesesBalanced(exp,size))
        printf("Balanced!\n");
        else
        printf("Not Balanced!\n");

    }

【问题讨论】:

  • 从输入开始:什么时候它会给你错误输出吗?
  • 当我输入 () 时它给出的不平衡
  • 您是否尝试过在各个点使用尽可能多的打印语句来检查哪里出了问题,或者使用笔和纸检查整个事情 - 否则使用调试器。
  • 我没有这样做。我不知道如何使用调试器。有什么建议吗?
  • @dsaharia 如果您的系统上安装了 GDB(检查在终端上运行 gdb --version),那么这里有一个链接:youtube.com/watch?v=sCtY--xRUyI 否则使用多个打印语句,这也将帮助您.

标签: c stack stack-overflow parentheses brackets


【解决方案1】:

我同意上述 cmets 的观点,即您应该花一些时间来学习如何调试您的程序。

您的代码的问题在于您读取用户输入的方式。 %c 匹配所有字符,包括换行符。当前形式的代码读取用户数据大小和数据本身之间的换行符作为输入的第一个字符,因此 exp[0] == '\n'。有多种方法可以解决此问题,例如刷新输入或取消注释您评论的行(并摆脱多余的百分号或切换到其他读取输入的方式,例如使用 %s 而不是在循环中使用 %c。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    这是正常工作的最小修改版本:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX 25
    
    int top = -1;
    char stack[MAX];
    
    void push(char x)
    {
        if(top > MAX - 1){              //CHANGED
        printf("Stack Overflow\n");
        return;
       }
    
        stack[++top] = x;
    }
    
    char pop()
    {
        char popped;
        if(top == -1) {
        printf("Stack Underflow\n");
        return 0;
        }
    popped = stack[top];
    --top;
    return popped;
    }
        char Top()
    {
        return (stack[top]);
    
    }
    int arePair(char opening,char closing)
    {
        if(opening =='(' && closing == ')') return 1;
        else if((opening =='{' && closing == '}')) return 1;
        else if (opening =='[' && closing == ']') return 1;
        return 0;
    }
    
    int paranthesesBalanced(char *exp,int size)
    {
       for (int i=0;i<size;i++)
       {
            if(exp[i] == '(' || exp[i] == '{' || exp[i] == '[')
                push(exp[i]);
            else if (exp[i] == ')' || exp[i] == '}'|| exp[i] == ']') 
            {
                if(top == -1 || !arePair(Top(),exp[i]))
                return 0;
                else
                pop();
            }
       }
       return (top == -1 ? 1:0);
    }
    
    
    int main()
    {
        char exp[25];
        int size=0;
        printf("Enter the size of xpression\n");
        scanf(" %d",&size);
        printf("Enter the expression(Less than 25 characters): \n");
        scanf("%s",exp);     //DELETED FOR LOOP - BETTER USE GETCHAR() RATHER THAN SCANF
        printf("%s\n",exp);
        if(paranthesesBalanced(exp,size))
        printf("Balanced!\n");
        else
        printf("Not Balanced!\n");
    }
    

    而不是scanf,您可以使用这种方式,因为scanf 不支持空格,即如果您输入hello world,它只会显示hello。替代方案:

     int i,count++;
     while((i=getchar())!=EOF)
     {
         if((i!=\0')&&(count<MAX))
             exp[count++]=i;
         else
             break;
     }
    

    通过这种方式,您可以轻松检查表达式的长度及其限制 + 它将允许您输入空格。

    【讨论】:

    • printf("%s\n", exp) 当用户输入超过这里的25个字符时会导致堆栈溢出,"%24s"会更好。
    • @robal 这就是为什么我建议getchar 保留支票:)
    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2016-06-26
    相关资源
    最近更新 更多