Вам надо сопоставить каждой открывающей скобке - соответствующую закрывающую.
В простейшем случае это делается одним проходом по тексту со стеком.
Встретили открывающую скобку - положили ее позицию в стек. Встретили закрывающую - вынимаем последнюю позицию из стека. Кусок от этой позиции до текущей - ваш блок кода.
Этот алгоритм на вашем примере выведет именно то, что вам надо, но куски будут в обратном порядке, отсортированне по правому краю. Если надо сортировать именно как вы указали, то надо развернуть алгоритм - идите с конца и кладите в стек закрывающие скобки.
Можно алгоритм усложнить, если надо какую-то проверку на синтаксис делать. Тогда вам придется, во первых, разбить текст на токены. Во вторых класть в стек всякие разные открывающие токены. Например, туда еще пойдут '[', '(' в С или "begin" в паскале. Потом при встрече любого закрывающего токена нужно проверить, что на вершине стека лежит правильный открывающий токен.
Еще важно не забыть, что при некорректном входном коде у вас стек может кончится раньше времени. Например: "{a};}{". Тут, когда вы дойдете до второй скобки, у вас будет пустой стек. Это означает, что текст некорректен.