Delphi 有沒有像java中的java.util.Stack()去new |
尚未結案
|
syene
一般會員 發表:17 回覆:12 積分:5 註冊:2003-01-04 發送簡訊給我 |
不想自己去type一個stack class,
因為如果是這樣,
勢必要先type出你的pointer只到的資料型態是啥,
有沒有現成的可以去createㄋ,
類似java.util.Stack(),
而且不用先宣告要push的資料型態,
就可push任意資料型態的資料進去,
這些資料物件也好,record也罷,或是pascal的基本資料型態也行,
當然同一stack instance只能拿來push同一類資料型態的資料,
總之就是有一個現成內建的class可供create,
然後拿它來push應用程式中的資料. tkx
|
jamests
初階會員 發表:0 回覆:43 積分:28 註冊:2005-01-21 發送簡訊給我 |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
引言: 不想自己去type一個stack class, 因為如果是這樣, 勢必要先type出你的pointer只到的資料型態是啥, 有沒有現成的可以去createㄋ, 類似java.util.Stack(), 而且不用先宣告要push的資料型態, 就可push任意資料型態的資料進去, 這些資料物件也好,record也罷,或是pascal的基本資料型態也行, 當然同一stack instance只能拿來push同一類資料型態的資料, 總之就是有一個現成內建的class可供create, 然後拿它來push應用程式中的資料. tkx自己做一个也不难。大概代码如下: TMyStack=class private FList:TList; FClass:TClass; public Contructor Create(WhichClass:TClass); Destructor Destroy;override; procedure Push(AObj:TObject); function Pop:TObject; published end;大概就是类似上面这样的代码吧。其中:FClass用来限制当前对象的实例究竟是用来放什么类型的对象的,比如,是放TButton还是放TLabel。当然也可以不要这个,直接允许放Pointer,什么类型都可以同时放进去。 实际上放进去的东西,是放到FList这个TList里去了。PUSHU的时候就用TList.Add把它加到FList最尾的地方。POP的时候就从FList最尾的地方取出来:FClass(Result:=FList[FList.Count-1]); 这样就是一个标准的后进先出的Stack了。 |
syene
一般會員 發表:17 回覆:12 積分:5 註冊:2003-01-04 發送簡訊給我 |
引言:感謝jamests ,pcplayer99兩位先知的寶貴意見, 我已經大慨有頭緒了, 不過我也試了jamests所提供的TStack (uses Contnrs), 發現再pop時有無法掌握該物件的成員資料, 以下是我用delphi的TStack (uses Contnrs)所code的內容, resourcestring Form_Title='Stack operation: Items = %d'; var Stack:TObjectStack; element:TElement; {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Caption:=Format(Form_Title,[0]); Stack:=TObjectStack.Create; element:=TElement.Create; Memo1.Lines.Clear; end; procedure TForm1.FormDestroy(Sender: TObject); begin Stack.Free; element.Free; end; procedure TForm1.Button1Click(Sender: TObject); begin if Edit1.Text<>'' then begin element.name:=Edit1.Text; Stack.Push(element); Memo1.Lines.Add(TElement(Stack.Peek).name); Caption:=Format(Form_Title,[Stack.Count]); Button3Click(nil); end; Edit1.SetFocus; end; procedure TForm1.Button2Click(Sender: TObject); begin if Stack.Count>0 then begin Label1.Caption:=TElement(Stack.Pop).name; Memo1.Lines.Delete(Stack.Count); Caption:=Format(Form_Title,[Stack.Count]); Button3Click(nil); end; Edit1.SetFocus; end; procedure TForm1.Button3Click(Sender: TObject); begin if Stack.Count>0 then ShowMessage('Top item : ' TElement(Stack.Peek).name) else ShowMessage('No Item in stack!'); Edit1.SetFocus; end; end. 問題說明: 1.button1作push動作正常. 2.button2作pop動作,但TElement(Stack.pop).name卻一直是最後一筆資料name. 3.button3作peek動作,但不管pop幾次,甚至已經剩下最後一筆,他還是return最後一筆被push進去的name. 4.但如果pop幾次後又push一筆進去,這時peek就會return這一筆,這樣就正常了,why?peek不是會隨時return stack 最上端的一筆嗎?也就是說我一次PUSH五筆,接著pop三筆,那這時peek 不是會return第二筆嗎? Tkx 發表人 - syene 於 2005/01/26 23:47:11引言: 不想自己去type一個stack class, 因為如果是這樣, 勢必要先type出你的pointer只到的資料型態是啥, 有沒有現成的可以去createㄋ, 類似java.util.Stack(), 而且不用先宣告要push的資料型態, 就可push任意資料型態的資料進去, 這些資料物件也好,record也罷,或是pascal的基本資料型態也行, 當然同一stack instance只能拿來push同一類資料型態的資料, 總之就是有一個現成內建的class可供create, 然後拿它來push應用程式中的資料. tkx自己做一个也不难。大概代码如下:TMyStack=class private FList:TList; FClass:TClass; public Contructor Create(WhichClass:TClass); Destructor Destroy;override; procedure Push(AObj:TObject); function Pop:TObject; published end;大概就是类似上面这样的代码吧。其中:FClass用来限制当前对象的实例究竟是用来放什么类型的对象的,比如,是放TButton还是放TLabel。当然也可以不要这个,直接允许放Pointer,什么类型都可以同时放进去。 实际上放进去的东西,是放到FList这个TList里去了。PUSHU的时候就用TList.Add把它加到FList最尾的地方。POP的时候就从FList最尾的地方取出来:FClass(Result:=FList[FList.Count-1]); 这样就是一个标准的后进先出的Stack了。 |
jamests
初階會員 發表:0 回覆:43 積分:28 註冊:2005-01-21 發送簡訊給我 |
您好: 您推入的元件似乎都是同一個,
然後只改該元件的值. 所以造成您辨識上的錯亂了. 以下提供我的測試:
procedure TForm1.Button1Click(Sender: TObject);
var
ed: TEdit;
begin
ed:=TEdit.Create(nil); // Stack只存放point, 所以point指到的元件要個別存在
ed.Text:=TimeStr(now);
Stack.Push(ed);
end; procedure TForm1.Button2Click(Sender: TObject);
var
ed: TEdit;
begin
if stack.Count=0 then exit; // assert not empty
ed:=TEdit(Stack.Pop);
ShowMessage(ed.Text);
FreeAndNil(ed); // 記得資源的釋放
end; procedure TForm1.Button3Click(Sender: TObject);
var
ed: TEdit;
begin
ShowMessage('before peek count:' IntToStr(stack.Count));
if stack.Count>0 then begin
ed:=TEdit(Stack.Peek);
ShowMessage('after peek count:' IntToStr(stack.Count));
ShowMessage('First Data:' ed.Text);
end;
//FreeAndNil(element); 由於stack裡還存有該元件point, 所以不能釋放;
end;
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |