Проверить баланс скобок () [] {} в строке - C (СИ)
Формулировка задачи:
Добрый день, помогите написать программа на Си.
Программа должна проверять баланс скобок.
Например, пользователь вводит: ([hello]) программа выводит: Баланс соблюден
Если пользователь вводит: ([hello) программа выводит: Баланс не соблюден.
Решение задачи: «Проверить баланс скобок () [] {} в строке»
textual
Листинг программы
#include <stdio.h>
char * brackets_check(const char * s) {
switch ( *s ) {
case '\0' :
case ')' :
case '}' :
case ']' :
return (char*)s;
case '(' : {
char * ret = brackets_check(s + 1);
return ( *ret == ')' ) ? brackets_check(ret + 1) : (char*)s;
}
case '{' : {
char * ret = brackets_check(s + 1);
return ( *ret == '}' ) ? brackets_check(ret + 1) : (char*)s;
}
case '[' : {
char * ret = brackets_check(s + 1);
return ( *ret == ']' ) ? brackets_check(ret + 1) : (char*)s;
}
default :
return brackets_check(s + 1);
}
}
int main(void) {
char buf[BUFSIZ];
while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' )
printf("%s\n", ( *brackets_check(buf) ) ? "FAIL" : "OK");
return 0;
}
Объяснение кода листинга программы
В данном коде реализована функция brackets_check, которая принимает на вход строку и проверяет ее на корректность баланса скобок. Скобки различных типов (), [], {} считаются открывающими, а скобки тех же типов — закрывающими. Список действий, которые выполняются в коде:
- В функции brackets_check происходит проверка строки на корректность баланса скобок.
- Если в строке присутствует символ '\0', то есть строка пустая, то возвращается адрес этого символа.
- Если в строке присутствует закрывающая скобка без соответствующей открывающей, то возвращается адрес закрывающей скобки.
- Если в строке присутствует открывающая скобка без соответствующей закрывающей, то вызывается рекурсивная функция с аргументом s+1, где s — текущий указатель на символ в строке.
- Если в строке присутствуют фигурные скобки, то вызывается рекурсивная функция с аргументом s+1, где s — текущий указатель на символ в строке.
- Если в строке присутствуют квадратные скобки, то вызывается рекурсивная функция с аргументом s+1, где s — текущий указатель на символ в строке.
- Если в строке нет ни одного из перечисленных выше символов, то вызывается рекурсивная функция с аргументом s+1, где s — текущий указатель на символ в строке.
- В основной функции main происходит считывание строки с помощью fgets и вызов функции brackets_check.
- Результат проверки выводится на экран.
- Программа завершается возвратом значения 0.