请问如何实现队列的进队出队?
谢谢?
代码如下:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Contnrs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  MyQueue:TQueue;
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
a:string;
begin
a:='Hello,world!';
MyQueue.Push(@a);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
MyQueue:=TQueue.Create;
end;procedure TForm1.Button2Click(Sender: TObject);
var
S:^String;
begin
S:=MyQueue.Pop;
Edit1.Text:=^S;
end;end.但是并没有成功在edit1里面出现'Hello,world!'
请问问题出在哪里?
谢谢

解决方案 »

  1.   

    unit  Queue;interfaceuses Windows;function  IsEmpty(): Boolean;
    procedure EnQueue(pt: TPoint);
    function  OutQueue(): TPoint;implementationconst
      QueueLen = 10;var
      Pos: array[0..QueueLen] of TPoint;
      Frist: Integer =  0;
      Last: Integer = 0;procedure EnQueue(pt: TPoint);
    var
      tmp: Integer;
    begin
      tmp := (Last+1)mod(QueueLen+1);
      if (tmp = Frist) then OutQueue;
      Last := tmp;
      Pos[Last] := pt;
    end;function  OutQueue(): TPoint;
    begin
      if (Last = Frist) then
      begin
        Result.X := 0;
        Result.Y := 0;
      end else
      begin
        Frist := (Frist+1)mod(QueueLen+1);
        Result := Pos[Frist];
      end;
    end;function IsEmpty(): Boolean;
    begin
      Result := (Last=Frist);
    end;end.
      

  2.   

    type
      PMyRecord = ^TMyRecord;
      TMyRecord = record
        filename :String;
      end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      MyQueue:TQueue;    //声明队变量
      ARecord:PMyRecord;   //一个指针
      ss:String;
    {初始化部分}
    begin
      MyQueue:=TQueue.Create();
    {Push部分}
      New(ARecord);//给指针空间
      ARecord^.filename:='abcdefg';
      MyQueue.Push(ARecord);//进队
    {Pop部分}
      ARecord:=MyQueue.Pop;//出队
      Edit1.TExt:=ARecord^.filename;
      Dispose(ARecord);  //清空指针{释放队的资源}
      MyQueue.Free;
    end;
      

  3.   

    结点要用全局变量或者动态分配空间,TQUEUE维护的是指针
      

  4.   

    不用那么麻烦吧?
    VCL的Contnrs.pas里有个现成的TObjectQueue class。
    还有TObjectStack。
      

  5.   

    例:
    var
    MyQueue:TQueue; //声明队变量
    ARecord:^MyName; //一个指针
    i:integer;
    ss:String;
    {初始化部分}
    MyQueue:=TQueue.Create();
    {Push部分}
    for i=0 to 10 do
    begin
    New(ARecord);//给指针空间
    ARecord^.filename:=IntToStr(i);
    MyQueue.Push(ARecord);//进队
    end;
    {Pop部分} 
    for :=0 to (MyQueue.Count-1) do
    begin
    ARecord:=MyQueue.Pop;//出队
    ss:=ARecord^.filename;
    Dispose(ARecord); //清空指针
    end;{释放队的资源}
    MyQueue.Free;  
      

  6.   

    用PCHar空间才还的
    String不多适合的,除非用New来处理http://lysoft.7u7.net