кодесурса
«C

Упражнения на C: создание всех комбинаций правильно сформированных скобок из n заданных пар скобок

script1adsense2code
script1adsense3code

Программирование на C: Упражнение 11 с решением

Напишите C-программирование для генерации всех комбинаций правильно сформированных скобок из n заданных пар скобок.

 Пример: 
Вход n = 5
Выход: 
(() ()) (())
(() ()) () ()
(()) ((()))
(()) (() ())
(()) (()) ()
(()) () (())
(()) () () ()
() (((())))
() ((() ()))
() ((()) ())
() ((())) ()
() (() (()))
() (() () ())
() (() ()) ()
() (()) (())
() (()) () ()
() () ((()))
() () (() ())
() () (()) ()
() () () (())
() () () () ()

Код C:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static char** generate_Parenthesis(int n, int* returnSize)
{
    int left_num, right_num, cap = 5000, ctr = 0;
    char *stack = malloc(2 * n + 1);
    char **parentheses = malloc(cap * sizeof(char *));
    char *p = stack;
    left_num = right_num = 0;
    stack[2 * n] ='\0';
    while (p != stack || ctr == 0) {
        if (left_num == n && right_num == n) {
            parentheses[ctr] = malloc(2 * n + 1);
            strcpy(parentheses[ctr], stack);
            ctr++;
            while (--p != stack) {
                if (*p =='(') {
                    if (--left_num > right_num) {
                        *p++ =')';
                        right_num++;
                        break;
                    }
                } else {
                    right_num--;
                }
            }
        } else {
            /* forward */
            while (left_num < n) {
                *p++ ='(';
                left_num++;
            }
            while (right_num < n) {
                *p++ =')';
                right_num++;
            }
        }
    }
    *returnSize = ctr;
    return parentheses;
}
int main(void)
{
    int i, ctr;
    i = 5;
    char ** lists = generate_Parenthesis(i, &ctr);
    for (i = 0; i < ctr; i++) {
        printf("%s\n", lists[i]);
    }
    return 0;
}

Пример вывода:

 ((((()))))
(((() ())))
(((()) ()))
(((())) ())
(((()))) ()
((() (())))
((() () ()))
((() ()) ())
((() ())) ()
((()) (()))
((()) () ())
((()) ()) ()
((())) (())
((())) () ()
(() ((())))
(() (() ()))
(() (()) ())
(() (())) ()
(() () (()))
(() () () ())
(() () ()) ()
(() ()) (())
(() ()) () ()
(()) ((()))
(()) (() ())
(()) (()) ()
(()) () (())
(()) () () ()
() (((())))
() ((() ()))
() ((()) ())
() ((())) ()
() (() (()))
() (() () ())
() (() ()) ()
() (()) (())
() (()) () ()
() () ((()))
() () (() ())
() () (()) ()
() () () (())
() () () () ()

Блок - схема:

«C

Решение

Внесите свой код и комментарии через Disqus.

Предыдущий: Напишите программу на C, чтобы проверить, является ли данная строка действительной или нет, строка содержит символы '(', ')', '{', '}', '[' и ']'. Строка действительна, если открытые скобки должны быть закрыты скобками того же типа и в правильном порядке.
Далее: Напишите программу на C для удаления дубликатов из заданного массива целых чисел.

Каков уровень сложности этого упражнения?

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code