Другие языки программирования и технологии

Задача в паскале: реализовать рекурсивный алгоритм правильности расстановки скобок

Скобки могут быть четырёх типов: (), [], {}, <> - иными словами на вход подаётся любая строка со скобками (например "ab{cd()}[,,,,]" ) и нужно рекурсивно проверить, чтобы каждая использованная скобка открылась и закрылась) (нужен хотя бы примерный алгоритм решения)
Интересная задачка. Я бы сделал без рекурсии. Просто бежать по строке слева направо.

Встретил открывающую скобку — пишу ее в стек или массив.
Встретил закрывающую скобку — смотрю, что последним попало в мой стек или массив.

Если открывающая скобка в стеке есть хотя бы одна и она соответствует закрывающей, тогда всё хорошо, извлекаем открывающую из стека. Иначе говорим, что скобка не совпала.
СД
Санек Данчук
89 184
Лучший ответ
Роман Саранчин А вдруг там не обязательно правильность расположения скобок? типа вариант "aa(ss[ddd)fff]ggg" возможно тоже является правильным. Жалко ТС не написал задание, как оно ему задано, а не так, как он его интерпретировал.
строка :=
пустая строка
или
символ + строка
или
строка + символ
или
(строка) + строка
или
[строка] + строка
или
{строка} + строка
или
<строка> + строка
Простое и быстрое решение (берегите мозг! Там спагетти-код): http://rextester.com/HWEMK33437

.

Быстрое - потому что, к сожалению, для таких задач в паскале нет ничего быстрее прямого перебора... Даже если диалект включает in, этот оператор фактически приводит к копированию памяти... и при большом количестве вызовов, оно все безобразно тормозит. А операция взятия элемента по индексу, к копированию не приводит - хотя в данном конечно эт конкретном случае, это не работает: мы все равно теряем на передаче строки (создается ее локальная копия, т. к. вносим изменения. Можно обойти это просто передавая вместе с j доп. параметром, и выводя посимвольно - код будет еще ужаснее выглядеть :D ).

В общем, если будете что-то писать помимо учебы, в реальных проектах никогда так не делайте...
Слава Лукашов FindAndReplace('([)]', 1) выдает =ok
const b: array [boolean] of string=('НЕ правильно','правильно');
var p: integer;// номер символа в строке
s: string;

function fn(x: string; y: string): boolean;
var c: char; f: boolean;
begin
f:=y='';
repeat
inc(p);
c:=x[p];

if c=y then// закрытие
begin
fn:=true;
exit;
end;

if c in ['(','<','[','{'] then // открытие
begin
case c of
'(': f:=fn(x,')');
'<': f:=fn(x,'>');
'[': f:=fn(x,']');
'{': f:=fn(x,'}');
end;
end;

if c in [')','>',']','}'] then // нежданчик
begin
fn:=false;
exit;
end;
until p>=(length(x));
fn:=f and (y='');
end;

begin
s:='ab{cd()}[,,,,]';p:=0;writeln('В ',s,' скобки расставлены ',b[fn(s,'')]);
s:='ab{cd()}[,,<,]';p:=0;writeln('В ',s,' скобки расставлены ',b[fn(s,'')]);
s:='([)]';p:=0;writeln('В ',s,' скобки расставлены ',b[fn(s,'')]);
s:='(((()..';p:=0;writeln('В ',s,' скобки расставлены ',b[fn(s,'')]);
end.

/////////
В ab{cd()}[,,,,] скобки расставлены правильно
В ab{cd()}[,,<,] скобки расставлены НЕ правильно
В ([)] скобки расставлены НЕ правильно
В (((().. скобки расставлены НЕ правильно
Vladimir Gebel
Vladimir Gebel
20 418
Vladimir Gebel Адаптация под турбо паскаль 7.0 https://yadi.sk/d/aQfcQBX73QFMXm
Vladimir Gebel функция оказалась сложнее чем казалась в начале. предыдущие варианты содержат баги с выходом по некорректному закрывающему тегу и сыплется на входящей строке
ab{cd)[}[,,,,]
этот баг исправил в js версии https://jsfiddle.net/k23zh1Lf/. веду поиск оставшихся багов.
Интересная задачка. Я бы сделал без рекурсии. Просто бежать по строке слева направо.

Встретил открывающую скобку — пишу ее в стек или массив.
Встретил закрывающую скобку — смотрю, что последним попало в мой стек или массив.

Если открывающая скобка в стеке есть хотя бы одна и она соответствует закрывающей, тогда всё хорошо, извлекаем открывающую из стека. Иначе говорим, что скобка не совпала.
Это задачу можно решить с помощью ветвлений