Проверить, является ли введенная скобочная последовательность правильной (рекурсия) - C (СИ)
Формулировка задачи:
Дано слово из круглых и фигурных скобок. Требуется определить является ли введенное выражение правильным (Надеюсь не требуется объяснять что куда). Надо использовать рекурсию, для выделения подвыражений между одним типом скобок. В общих чертах алгоритм понимаю: берем первую скобку -> ищем ее закрывающую, все что между ними так же по рекурсии. Но код упорно не пишется Подскажите как правильно реализовать.
Заранее спасибо
Решение задачи: «Проверить, является ли введенная скобочная последовательность правильной (рекурсия)»
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, которая принимает на вход указатель на строку символов и проверяет, является ли эта строка правильной скобочной последовательностью. - В функции
mainсоздается буфер для ввода строки. - В основном цикле программы пользователю предлагается ввести строку.
- После ввода каждой строки вызывается функция
brackets_check, которая проверяет введенную строку. - Если строка является правильной скобочной последовательностью, выводится
OK. - Если строка не является правильной скобочной последовательностью, выводится
FAIL.
- Объявление функции
- Рекурсивная часть программы:
- В функции
brackets_checkиспользуется операторswitchдля проверки первого символа строки. - Если первый символ является конечным (пустым) символом, возвращается указатель на этот символ.
- Если первый символ является закрывающей скобкой (')', '}', ']'), возвращается указатель на предыдущий символ.
- Если первый символ является открывающей скобкой ('(','{','['), вызывается рекурсивно функция
brackets_checkдля следующей строки и возвращается результат. - Если первый символ не является скобкой, вызывается рекурсивно функция
brackets_checkдля следующей строки и возвращается результат.
- В функции