다음은 제가 작성한 간단한 stack프로그램입니다.
입력순서중 마지막 입력데이트를 추출하는 프로그램인데...."count-1"이 왜 마지막데이터를 가르키게 되는지 그 원리가 궁금합니다.별거 아닌것 같기두 한데 모르니까 영 답답하네여....
소스중에 표시해놨습니다.
unit stack;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
ListBox1: TListBox;
ListBox2: TListBox;
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Type
TStack = Class
top:1..100;
stk:array[1..100] of integer;
procedure push(i:integer);
function pop:integer;
constructor create;
end;
var
Form1: TForm1;
stack1:tstack;
implementation
{$R *.DFM}
constructor tstack.create;
begin
inherited create;
top:=1;
end;
procedure tstack.push(i:integer);
begin
if top < 100 then begin
stk[top]:=i;
inc(top);
end;
end;
function tstack.pop : integer ;
begin
if top >1 then begin
dec(top);
result:=stk[top];
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
stack1:=tstack.create;
edit1.text:='';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
stack1.push(strtoint(edit1.text));
listbox1.items.add(edit1.text);
edit1.clear;
edit1.setfocus;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if listbox1.items.count < 1 then
exit;
=========>요녀석입니다. listbox1.items.delete(listbox1.items.count-1);
listbox2.items.add(inttostr(stack1.pop));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
stack1.free;
end;
end.
제발 자세한 답변부탁드립니다.
님이 만드신 스택배열은 인덱스가 1부터 시작하죠? 그런데 TListBox.Items배열은 0부터
시작합니다. 그래서 1을 빼준것입니다...
^^ 항상 즐코하세요...
김동수 wrote:
> 다음은 제가 작성한 간단한 stack프로그램입니다.
> 입력순서중 마지막 입력데이트를 추출하는 프로그램인데...."count-1"이 왜 마지막데이터를 가르키게 되는지 그 원리가 궁금합니다.별거 아닌것 같기두 한데 모르니까 영 답답하네여....
> 소스중에 표시해놨습니다.
> unit stack;
>
> interface
>
> uses
> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
> StdCtrls;
>
> type
> TForm1 = class(TForm)
> Edit1: TEdit;
> ListBox1: TListBox;
> ListBox2: TListBox;
> Button1: TButton;
> Button2: TButton;
> Label1: TLabel;
> Label2: TLabel;
> Label3: TLabel;
> procedure FormCreate(Sender: TObject);
> procedure Button1Click(Sender: TObject);
> procedure Button2Click(Sender: TObject);
> procedure FormDestroy(Sender: TObject);
> private
> { Private declarations }
> public
> { Public declarations }
> end;
>
>
> Type
> TStack = Class
> top:1..100;
> stk:array[1..100] of integer;
> procedure push(i:integer);
> function pop:integer;
> constructor create;
> end;
> var
> Form1: TForm1;
> stack1:tstack;
> implementation
>
> {$R *.DFM}
>
> constructor tstack.create;
> begin
> inherited create;
> top:=1;
> end;
>
> procedure tstack.push(i:integer);
> begin
> if top < 100 then begin
> stk[top]:=i;
> inc(top);
> end;
> end;
>
> function tstack.pop : integer ;
> begin
> if top >1 then begin
> dec(top);
> result:=stk[top];
> end;
> end;
> procedure TForm1.FormCreate(Sender: TObject);
> begin
> stack1:=tstack.create;
> edit1.text:='';
> end;
>
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> stack1.push(strtoint(edit1.text));
> listbox1.items.add(edit1.text);
> edit1.clear;
> edit1.setfocus;
> end;
>
> procedure TForm1.Button2Click(Sender: TObject);
> begin
> if listbox1.items.count < 1 then
> exit;
>
> =========>요녀석입니다. listbox1.items.delete(listbox1.items.count-1);
> listbox2.items.add(inttostr(stack1.pop));
> end;
>
>
>
> procedure TForm1.FormDestroy(Sender: TObject);
> begin
> stack1.free;
> end;
>
> end.
> 제발 자세한 답변부탁드립니다.
>