我用这种方式进行stack操作,在入栈正常,可是peek的时候出现Access 
violation这样的错误,难道不能用数组吗var
  s: String;
  i: Integer;
begin
  s := 'abcde';
  stack := TStack.Create;
  for i := 1 to length(s) do
  begin
    stack.Push(pointer(s[i]));
  end;ShowMessage(String(stack.peek));这样就很正常
var
  s: String;
  i: Integer;
begin
  s := 'abcde';
  stack := TStack.Create;
  stack.Push(pointer(s));
end;ShowMessage(String(stack.peek));

解决方案 »

  1.   

    stack.Push(pointer(s[i]));
    把谁放到栈里面?不是s,而是s每个字符ascii码代表的内存地址。stack.Push(pointer(s));是对的。
      

  2.   

    我的第一段程序是这样的,我想把字符串的每个字符push到stack中,然后再取出来,我问的就是为什么peek或者pop的时候出错了。难道我push的不对,可是我在peek或pop的时候查了一下count,它的值确实是5啊。
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      aStr: string;
      pstr: PChar;
      i: Integer;
    begin
      aStr := 'abcdefghij';
      for i := 1 to 10 do
      begin
        pstr := StrNew(PChar(Copy(aStr, i , 1)));
        FStack.Push(pstr);
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      FStack := TStack.Create;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      i: Integer;
    begin
      for i := 1 to 10 do
      begin
        if FStack.Count < 1 then
          Break;
        ShowMessage(PChar(FStack.Pop));
      end;
    end;