Проверка круглых скобок в c с использованием стеков массивов, которые не выдают правильный вывод каждый раз - PullRequest
0 голосов
/ 22 сентября 2018

Я пытался написать проверку скобок в 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");

    }

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Вот минимальная измененная версия, которая работает правильно:

#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;
 }

Таким образом, вы можете легко проверить длину выражения и его пределы + это позволит вам ввести пробел.

0 голосов
/ 22 сентября 2018

Я согласен с комментариями выше, что вам следует потратить некоторое время, чтобы научиться отлаживать ваши программы.

Проблема с вашим кодом заключается в том, как вы читаете вводимые пользователем данные.% c соответствует всем символам, включая символ новой строки.Ваш код в текущей форме считывает новую строку между размером пользовательских данных и самими данными как первый символ ввода, поэтому exp [0] == '\ n'.Существует несколько способов решения этой проблемы, например, очистка ввода или раскомментирование строки, которую вы прокомментировали (и избавление от лишнего знака процента или переключение на другой способ чтения ввода, например, использование% s вместо использования% c в цикле.

Надеюсь, это поможет.

...