Это легко можно реализовать при помоши стека (можно даже не динамического стека , реализованого на массиве ).
Алгоритм такой :Код
for i := 1 to {длина строки ...} do begin
{если нашли открывающуюся скобку то добовлякм в стек}
{иначе смотрим на вершину стека , если там откр.скобка , то удаляем её}
{иначе , выходим из цикла , (уже есть случай неправильной постоновки скобок)}
end;
{если пройден весь цикл , то проверяем стек , если он НЕ пустой , то (уже есть случай неправильной постоновки скобок)}
Вот возможный вариант решения :Код
program skobki;
var stek : array[1..255] of char;
head : byte;
function isempty:boolean;
begin
isempty := (head = 0)
end;
procedure POP;
begin
if not(isempty) then dec(head);
end;
procedure PUSH(c:char);
begin
inc(head);
stek[head] := c;
end;
function showHead:char;
begin
showHead := stek[head];
end;
var wrong :boolean;
i : byte;
input : string;
begin
head := 0;
for i := 1 to 255 do stek[i] := ' ';
wrong := false;
writeln('input :');
readln(input);
for i := 1 to ord(input[0]) do begin
if input[i] = '(' then PUSH(input[i])
else if input[i] = ')' then
if showHead = '(' then POP
else begin wrong := true; break; end;
end;
if not(wrong) then wrong := not(isempty);
writeln(wrong);
readln;
end.