利用栈结构,在Delphi中有一个TStack类,定义了普通的栈(Contnrs单元)。
可以先把‘(’压入栈,然后每遇到一个‘)’就从栈里弹出一个'(',
到最后看看栈是否为空,如果是空的,那么配对就正确,否则,就出错。

解决方案 »

  1.   

    你让它算一下不行吗?
    try
    int:=3*(5+4);
    except
    showmessage('dddd!!!!');
    end;
      

  2.   

    例,给你作参考
    引:四则运算函数
    function sum(Value:String):string;
    const
      a = '+';
      b = '-';
      c = '*';
      d = '/';
      ea= '(';
      eb= ')';
      function GetToken(Value:String):String;
      var
        P1,P2:Integer;
      begin
        Result := '';
        P1 := Pos(ea,Value);
        if P1 <> 0 then
        begin
          P2 := Pos(eb,Value);
          Result := Copy(Value,P1+1,P2-P1-1);
        end;
      end;
      function GetResult(Value:String):String;
      var
        P1,P2,P3,P4,i,nStart,nEnd,P:Integer;
        N1,N2 : Real;
        Tmp : String;
        IsFuShu : Boolean;
      begin
        IsFuShu := False;
        N1 := 0;
        N2 := 0;
        P  := 0;
        P1 := Pos(c,Value);
        P2 := Pos(d,Value);
        P3 := Pos(a,Value);
        P4 := Pos(b,Value);
        while (P1<>0)or(P2<>0)or(P3<>0)or(P4<>0) do
        begin
          if (P3<>0) and (P4=0) then
            P := P3;
          if (P3=0)  and (P4<>0)then
            P := P4;
          if (P3<>0) and (P4<>0) and (P4>P3) then
            P := P3;
          if (P3<>0) and (P4<>0) and (P4<P3) then
            P := P4;
          if (P1<>0) and (P2=0) then
            P := P1;
          if (P1 =0) and (P2<>0)then
            P := P2;
          if (P1<>0) and (P2<>0) and (P2>P1) then
            P := P1;
          if (P1<>0) and (P2<>0) and (P1>P2) then
            P := P2;
          if P <> 0 then
          begin
            for i := P-1 downto 1 do
            begin
              if (Value[i]=a)or(Value[i]=b)or(Value[i]=c)
              or(Value[i]=d)or(Value[i]=ea)or(i=1) then
              begin
                if i<>1 then
                  N1 := StrToFloat(Copy(Value,i+1,P-i-1))
                else
                N1 := StrToFloat(Copy(Value,1,P-1));
                  Break;
              end;
            end;
            if i<>1 then
              nStart := i+1
            else nStart := 1;
            for i := P+1 to Length(Value) do
            begin
              if (Value[i]=a)or(Value[i]=b)or(Value[i]=c)
              or(Value[i]=d)or(Value[i]=eb)or(i=Length(Value)) then
              begin
                if i<>Length(Value) then
                   N2 := StrToFloat(Copy(Value,P+1,i-P-1))
                else
                  N2 := StrToFloat(Copy(Value,P+1,i));
                Break;
              end;
            end;
            if i=Length(Value) then
            nEnd := i+1
            else
              nEnd := i;
            if P=P1 then
              Tmp := FloatToStr(N1*N2);
            if P=P2 then
              Tmp := FloatToStr(N1 / N2);
            if P=P3 then
              Tmp := FloatToStr(N1+N2);
            if P=P4 then
            begin
              if N1<N2 then
              begin
                IsFuShu := Not IsFuShu;
                Tmp := FloatToStr(N2-N1);
              end;
              if N1>N2 then
                Tmp := FloatToStr(N1-N2);
            end;
            if nEnd <> 1 then
              Delete(Value,nStart,nEnd-nStart)
            else
              Delete(Value,nStart,nEnd);
            Insert(Tmp,Value,nStart);
        end;
        P1 := Pos(c,Value);
        P2 := Pos(d,Value);
        P3 := Pos(a,Value);
        P4 := Pos(b,Value);
        end;
        if IsFuShu then
          Result := '-'+Value
        else
          Result := Value;
      end;
    var
      S : String;
      P1,P2 : Integer;
    begin
      P1 := Pos(ea,Value);
      P2 := Pos(eb,Value);
      while GetToken(Value) <> '' do
      begin
        P1 := Pos(ea,Value);
        P2 := Pos(eb,Value);
        S:=GetToken(Value);
        S:=GetResult(S);
        Delete(Value,P1,P2-P1+1);
        Insert(S,Value,P1);
      end;
      Result := GetResult(Value);
    end;
      

  3.   

    function  GetValid(source:String):boolean;
    var
    slen,top,i:integer;
    begin
    i:=1;top:=1;//TOP是栈顶指针
    slen:=length(source);
    while (top>0) and (i<slen)  do 
    begin
    case source[i] of
    '(':top:=top+1;
    ')':top:=top-1;
    else
    i:=i+1;
    end;
    end;
    if top=1 then   GetValid:=true
            else  if top>1 then  GetValid:=false //'('太多
          else    GetValid:=false  //')'太多
    end;
      

  4.   

    TommyTong(童童——好小猪) 说的不错,检查括号的配对情况正是一个很好的栈应用。不过zhangpeigao(东部一绝)用try except异常处理的方法也是个好方法——假设你保证你的算式里只可能括号匹配出错,而其它的一切都正确,否则你将不能知道到底是哪方面出了问题。