,新手,Delphi 用栈处理字符串匹配有关问题,求大神

紧急求助,新手,Delphi 用栈处理字符串匹配问题,求大神
现在的一个form的procedure 中要对一个字符串 进行括号匹配检测,boss叫用栈做,本身字符串中就一对括号()。
想来想去对于Delphi中的指针不甚了解。无从下手,求大神帮忙,急
------解决思路----------------------
栈:原理是FILO。也就是先进后出,每次出栈都是出堆栈里面最后进栈的那个元素。

所以,堆栈的两个基本函数就是PUSH和OUT
function PUSH(NewElement:TStack;var Statck:TStack):Boolean;
begin
  NewElement:=New(TStack);
  NewElement.Next:=Statck;
  Stack:=NewElement;
  Result:=True;
end;
function OUT(var OutElement:TStack;var Statck:TStack):Boolean;
begin
  OutElement:=Statck;
  Stack:=Statck.Next;
  Result:=True;
end;

以上代码只是演示,并未上机测试

------解决思路----------------------
然后,对你说的字串具体处理的思路不是很明白
------解决思路----------------------
先执行PUSH,堆栈中就成了:)0(((()(DNA10
再用OUT找出第一个右括号,寻找过程中,如果先出现左括号——非法;寻找过程中,遇到第二个右括号,递归
继续OUT找出第一个左括号,判断出栈的元素是否为合法表达式,递归返回

记住,递归过程中需要记录当前括号中的字符

这是大概的算法,实际代码没有空去帮你想啊,自己努力吧

------解决思路----------------------
这是一个算法的书面讲解,实际的内容需要你自己定义好才行
TStack是上课时候老师对堆栈的统称

实在没有概念的,要找PASCAL的书来看才行,DELPHI的书很少说到这些基础算法的,而且年份最好是在9x年代的说的最多
------解决思路----------------------
,新手,Delphi 用栈处理字符串匹配有关问题,求大神
首先分段,一个字符一个字符的匹配,只要匹配到括弧,就入栈,比如123(34)进入堆栈为
123
(
34
)
这样的结构,最开始先将正反括弧的个数都记录,如果正反括弧个数就不等,就说明肯定不匹配,后面不用管了,直接退出,否则一个一个的字符串出栈,然后进行匹配,也就是计算进入的括弧的个数,然后出来一个对应的反括弧,就对应的减法,最终应该是双向平衡的。就匹配完成
------解决思路----------------------
引用:
Quote: 引用:

先执行PUSH,堆栈中就成了:)0(((()(DNA10
再用OUT找出第一个右括号,寻找过程中,如果先出现左括号——非法;寻找过程中,遇到第二个右括号,递归
继续OUT找出第一个左括号,判断出栈的元素是否为合法表达式,递归返回

记住,递归过程中需要记录当前括号中的字符

这是大概的算法,实际代码没有空去帮你想啊,自己努力吧

简单写了一个,上代码,你看看能不能实现
Pstack = ^Tstack;
    Tstack = record
        Str : String;
        Top  : integer;
    end;
    procedure Initstack(Lstack : Tstack);
    function Push(Lstack : Tstack; str :char) : Tstack;
    function Pop(Lstack : Tstack): Tstack;
    function IsEmpty(Lstack : Tstack) : integer;
   procedure TFDbQry.Initstack(Lstack: Tstack);
begin
    Lstack.Str := '';
    Lstack.TOP := -1;
end;

function TFDbQry.IsEmpty(Lstack: Tstack): integer;
begin
    if Lstack.Top = 0 then
        result := 1
    else
        result := 0;
end;

function TFDbQry.Pop(Lstack: Tstack): Tstack;
begin
    if Lstack.Top = 0 then
        Application.MessageBox('输入的条件有错误,请仔细检查!','提示',16)
    else if Lstack.Top = 1 then
    begin
        Lstack.Top := 0;
        Lstack.str := '';
        result := Lstack;
    end
    else
    begin
        Lstack.Top := Lstack.Top - 1;
        Lstack.str := copy(Lstack.str,1,Lstack.Top);
        result := Lstack;
    end;
end;

function TFDbQry.Push(Lstack: Tstack; str: char): Tstack;
begin
    Lstack.Top := Lstack.Top + 1;
    Lstack.Str := Lstack.Str + str;
    result := Lstack;
end;




     lstack.Top := 0;
    Initstack(lstack);
    for I := 0 to TjItems.Count - 1 do
    begin
        //检测括号是否匹配
       if TjItems.Strings[I] = '(' then
       begin
           lstack := push(lstack,'(');
       end
       else if TjItems.Strings[I] = ')' then
       begin
           lstack := pop(lstack);
       end;
感觉特别简单,没有用到算法这些原理。。。。。。。。。。。,,,


,新手,Delphi 用栈处理字符串匹配有关问题,求大神