С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 30.10.2014
Сообщений: 1

Проверить, является ли введенная скобочная последовательность правильной (рекурсия)

24.11.2014, 00:03. Показов 5660. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дано слово из круглых и фигурных скобок. Требуется определить является ли введенное выражение правильным (Надеюсь не требуется объяснять что куда). Надо использовать рекурсию, для выделения подвыражений между одним типом скобок. В общих чертах алгоритм понимаю: берем первую скобку -> ищем ее закрывающую, все что между ними так же по рекурсии. Но код упорно не пишется Подскажите как правильно реализовать.
Заранее спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.11.2014, 00:03
Ответы с готовыми решениями:

Проверить, является ли введенная последовательность чисел рядом Фибоначчи
Здравствуйте! Закопался тут с одной задачей - требуется написать программу проверяющую является ли введенная последовательность чисел рядом...

Проверить, является ли правильной скобочная последовательность
Ограничение по времени работы программы: 1 секунда Требуется определить, является ли правильной данная последовательность круглых,...

Используя стек, проверить, является ли правильной скобочная последовательность
Используя стек, проверить, является ли правильной скобочная последовательность, в которую входят скобки трех типов: , { }, . Формат...

13
36 / 30 / 31
Регистрация: 16.11.2014
Сообщений: 90
24.11.2014, 21:56
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "conio.h"
#include "stdio.h"
#include "windows.h"
 
bool func(char * str, int kol){
    for (int i = 0; i < kol; i++){
        if (str[i] == ')'){
            for (int j = i - 1; j >= 0; j--){
                if (str[j] == '('){
                    str[i] = str[j] = '*';
                    break;
                    func(str, kol);
                }
                if (str[j] == '{'){
                    printf("ERROR");
                    return false;
                }
            }
        }
        if (str[i] == '}'){
            for (int j = i - 1; j >= 0; j--){
                if (str[j] == '{'){
                    str[i] = str[j] = '*';
                    break;
                    func(str, kol);
                }
                if (str[j] == '('){
                    printf("ERROR");
                    return false;
                }
            }
        }
    }
}
 
int main(){
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    char * str = new char[1000];
    printf("Введите строку:\n");
    fgets(str, 1000, stdin);
    if (func(str, strlen(str)))
        printf("It's OK");
    delete[] str;
    _getch();
    return 0;
}
работает даже с выражениями типа (a{i}{(a+b)}=5)
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
24.11.2014, 22:41
xBeSSonik,
во-первых где рекурсия,
во -вторых в C нет new/delete,
и в-третьих это не компилируется
0
36 / 30 / 31
Регистрация: 16.11.2014
Сообщений: 90
25.11.2014, 01:11
bool func(char * str, int kol)
func(str, kol);

чем тебе не рекурсия, внимательнее глянь)
а на счет new delete
вместо char * str = new char[1000]
char str[1000]
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
25.11.2014, 01:44
Цитата Сообщение от xBeSSonik Посмотреть сообщение
чем тебе не рекурсия, внимательнее глянь)
ты про 12 и 25 строчки? Я их заметил. Только выполнены они не будут, т.к. перед ними break

Добавлено через 9 минут
Цитата Сообщение от Jewbacabra Посмотреть сообщение
и в-третьих это не компилируется
не заметил что включена опция считать варнинги за ошибки, но тем не менее: warning C4715: 'func' : not all control paths return a value
и как следствие пример неправильной работы: http://ideone.com/Zgro6R
0
36 / 30 / 31
Регистрация: 16.11.2014
Сообщений: 90
25.11.2014, 02:00
да с break лажанул

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "conio.h"
#include "stdio.h"
#include "windows.h"
 
bool func(char * str, int kol){
    for (int i = 0; i < kol; i++){
        if (str[i] == ')'){
            for (int j = i - 1; j >= 0; j--){
                if (str[j] == '('){
                    str[i] = str[j] = '*';
                    func(str, kol);
                    break;                  
                }
                if (str[j] == '{'){
                    printf("ERROR");
                    return false;                   
                }
            }
        }
        if (str[i] == '}'){
            for (int j = i - 1; j >= 0; j--){
                if (str[j] == '{'){
                    str[i] = str[j] = '*';
                    func(str, kol);
                    break;                  
                }
                if (str[j] == '('){
                    printf("ERROR");
                    return false;
                }
            }
        }
    }
}
 
int main(){
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    char * str = new char[1000];
    printf("Введите строку:\n");
    fgets(str, 1000, stdin);
    if (func(str, strlen(str)))
        printf("It's OK");
    delete[] str;
    _getch();
    return 0;
}
так по идее просто поменять местами

Добавлено через 6 минут
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "conio.h"
#include "stdio.h"
#include "windows.h"
 
bool func(char * str, int kol){
    for (int i = 0; i < kol; i++){
        if (str[i] == ')'){
            for (int j = i - 1; j >= 0; j--){
                if (str[j] == '('){
                    str[i] = str[j] = '*';
                    func(str, kol);
                    break;                  
                }
                if (str[j] == '{'){
                    printf("ERROR");
                    return false;                   
                }
            }
        }
        if (str[i] == '}'){
            for (int j = i - 1; j >= 0; j--){
                if (str[j] == '{'){
                    str[i] = str[j] = '*';
                    func(str, kol);
                    break;                  
                }
                if (str[j] == '('){
                    printf("ERROR");
                    return false;
                }
            }
        }
    }
    return true;
}
 
int main(){
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    char * str = new char[1000];
    printf("Введите строку:\n");
    fgets(str, 1000, stdin);
    if (func(str, strlen(str)))
        printf("It's OK");
    delete[] str;
    _getch();
    return 0;
}
return true потерял)
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
25.11.2014, 11:25
Цитата Сообщение от xBeSSonik Посмотреть сообщение
ак по идее просто поменять местами
работает не верно: http://ideone.com/gbA742
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
26.11.2014, 01:30
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#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;
}
0
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 33
07.04.2019, 22:37
easybudda
Здравствуйте,можете ли вы пожалуйста примерно объяснить словесно или показать на этом же коде, как использую backtracking определить все возможные варианты удаления минимального количества скобок , чтобы они были расставлены правильно?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
08.04.2019, 00:57
Цитата Сообщение от xraze666 Посмотреть сообщение
как использую backtracking определить все возможные варианты удаления минимального количества скобок
Ничего не понял.
Функция возвращает указатель на терминальный ноль, если скобки расставлены правильно (или их вообще нет), или указатель на первый ошибочный символ. Логика предельно простая: если встречается одна из открывающих скобок, проверяется значение, возвращённое рекурсивным вызовом. Если оно совпадает с ожидаемым, функция продолжает выполнение, пока терминальный ноль не встретится...
0
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 33
08.04.2019, 01:18
easybudda Нет,нет, это я всё отлично понял. Я имел ввиду добавить условие в задачу, используя метод перебора с возвратом, выводить все такие случаи,где удаляя минимальное количество скобок,мы получим верную запись. Попробую пояснить
Вход: ()())()
Возможные варианты: «()()()» и «(())()»
(удалили 5-ю или 2-ю скобку)
Исходная запись не верна,и мы стараемся ее исправить. Вот я и хотел бы узнать как это осуществить именно через перебор с возвратом
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
08.04.2019, 01:48
xraze666, именно в таком виде функция решает только поставленную задачу. А как её изменить - думать надо. К примеру, если вернулся указатель на закрывающую скобку, его нужно удалить. А если после открывающей скобки вернулся указатель на '\0' - или перед ним вставлять нужную закрывающую, или опять же открывающую удалять...
0
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 33
08.04.2019, 10:43
easybudda
или перед ним вставлять нужную закрывающую, или опять же открывающую удалять...
Вставлять мы не будем вообще, только удалять лишние
0
08.04.2019, 11:23

Не по теме:

Цитата Сообщение от xraze666 Посмотреть сообщение
Вставлять мы не будем вообще
Меня это ваше "мы" несколько настораживает...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.04.2019, 11:23
Помогаю со студенческими работами здесь

проверить является ли введенная строка правильной записью русского слова
проверить является ли введенная строка правильной записью русского слова Добавлено через 1 минуту С использование флага

проверить является ли введенная с клавиатуры строка правильной записью вещественного отрицательного числа
проверить является ли введенная с клавиатуры строка правильной записью вещественного отрицательного числа

Рекурсия: проверить, соответствует ли введенная последовательность символов понятию скобки
Доброго времени суток. Мне необходимо написать рекурсивную функцию для решения задачи: Помогите пожалуйста в решении данной...

Проверить является ли введенная последовательность возрастающей
/* является ли введенная последовательность возрастающей(не считая 0) */ bool cin_is_increasing() { int i = 0; int answr = 0;...

Строки. Проверить, является ли введенная с клавиатуры последовательность символов целым числом, записанным в десятичной системе счисления
Составить программу, которая проверяет, является ли введенная с клавиатуры последовательность символов целым числом, записанным в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru