Средство проверки круглых скобок в c с использованием стеков массивов не всегда производит правильный вывод

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

    }

начать с ввода: когда дает ли он вам выход неправильный?

Serge 22.09.2018 13:06

когда я ввожу (), он дает несбалансированный

dsaharia 22.09.2018 13:10

Вы пробовали использовать как можно больше операторов печати в разных точках, чтобы проверить, где что-то идет не так, или проверять это с помощью ручки и бумаги, просматривая все это - иначе используйте отладчик.

Gaurav 22.09.2018 13:11

Я этого не делал. Я не умею пользоваться отладчиком. какие-либо предложения?

dsaharia 22.09.2018 13:13

@dsaharia Если в вашей системе установлен GDB (проверьте, запущен ли gdb --version) на вашем терминале, то вот ссылка на это: youtube.com/watch?v=sCtY--xRUyI Иначе используйте несколько операторов печати, которые также вам помогут.

Gaurav 22.09.2018 13:16

Спасибо. Есть другие предложения?

dsaharia 22.09.2018 13:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
92
2

Ответы 2

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

Проблема с вашим кодом заключается в том, как вы читаете вводимые пользователем данные. % c соответствует всем символам, включая символ новой строки. Ваш код в текущей форме считывает новую строку между размером пользовательских данных и самими данными как первый символ ввода, поэтому exp [0] == '\ n'. Есть несколько способов решить проблему, например, очистить ввод или раскомментировать строку, которую вы прокомментировали (и избавиться от лишнего знака процента или переключиться на другой способ чтения ввода, например, используя% s вместо использования% 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){              //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 22.09.2018 13:44

@robal Вот почему я предложил getchar оставить чек :)

Gaurav 22.09.2018 13:46

Другие вопросы по теме