Так же думаю надо вставить приоритет скобок.
Поидее '{' имеет больший приоритет чем '(', а она в свою очередь выше '['...
И вот еще одна проблемка:
({)} так стоять скобки не могут... Вот тут то как раз и начинаются сложности...
Вот только что нашел вот такую реализацию (через стек):
Код:
function Check(const S:string):boolean;
var
i:integer;
Stack:TStack;
c:char;
begin
Result:=false;
Stack:=TStack.Create;
for i:=1 to Length(S) do
begin
if not (S[i] in ['{','[','(','}',']',')']) then continue;
if S[i] in ['{','[','('] then Stack.Push(@S[i])
else
if Stack.Count>0 then
begin
case Char((Stack.Peek)^) of
'[': c:=']';
'(': c:=')';
'{': c:='}';
else c:=Chr(0);
end;
if c<>S[i] then
begin
if Stack.Count=0 then ShowMessage('ошибка в '''+S[i]+'')
else ShowMessage('ошибка в '''+c+'');
exit;
end else Stack.Pop;
end else
begin
ShowMessage('ошибка в '''+S[i]+'');
exit;
end;
end;
if Stack.Count>0 then
begin
ShowMessage('ошибка в '''+Char((Stack.Pop)^)+'');
exit;
end;
Stack.Free;
Result:=true;
end;
Может есть другой вариант? (хотя и этот не плох, нашел его после создания темы...)