Показать сообщение отдельно
  #2  
Старый 01.10.2010, 15:22
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Так же думаю надо вставить приоритет скобок.
Поидее '{' имеет больший приоритет чем '(', а она в свою очередь выше '['...

И вот еще одна проблемка:
({)} так стоять скобки не могут... Вот тут то как раз и начинаются сложности...

Вот только что нашел вот такую реализацию (через стек):

Код:
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;

Может есть другой вариант? (хотя и этот не плох, нашел его после создания темы...)
Ответить с цитированием