四、Delphi 2009 泛型容器单元(Generics.Collections)[3]: TStack<T>

TQueue 和 TStack, 一个是队列列表, 一个是堆栈列表; 一个是先进先出, 一个是先进后出.

TStack 主要有三个方法、一个属性:
Push(压栈)、Pop(出栈)、Peek(查看下一个要出栈的元素);
Count(元素总数).

 

ContractedBlock.gif ExpandedBlockStart.gif pas
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 
= class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    
procedure FormCreate(Sender: TObject);
    
procedure FormDestroy(Sender: TObject);
    
procedure Button1Click(Sender: TObject);
    
procedure Button2Click(Sender: TObject);
    
procedure Button3Click(Sender: TObject);
  
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses Generics.Collections; {Delphi 2009 新增的泛型容器单元}

type
  TRec 
= record
    Name: 
string;
    Age: Word;
  
end;

var
  Stack: TStack
<TRec>;  {定义一个泛型 TStack 类, 这指定了要用于上面定义的 TRec 记录}

{建立}
procedure TForm1.FormCreate(Sender: TObject);
begin
  Stack :
= TStack<TRec>.Create;

  Memo1.Clear;
  Button1.Caption :
= Button1.Caption + ' 压栈';
  Button2.Caption :
= Button2.Caption + ' 出栈';
  Button3.Caption :
= Button3.Caption + ' 下一个出栈的';
end;

{释放}
procedure TForm1.FormDestroy(Sender: TObject);
begin
  Stack.Free;
end;

{压栈: Push}
procedure TForm1.Button1Click(Sender: TObject);
var
  rec: TRec;
begin
  rec.Name :
= StringOfChar(Char(65 + Random(26)), 3);
  rec.Age :
= Random(150);
  Stack.Push(rec);
  Text :
= Format('当前队列成员总数: %d', [Stack.Count]);

  
{让 Memo1 配合显示}
  Memo1.Lines.Add(Format(
'%s, %d', [rec.Name, rec.Age]));
end;

{出栈: Pop}
procedure TForm1.Button2Click(Sender: TObject);
var
  rec: TRec;
begin
  
if Stack.Count = 0 then Exit;
  rec :
= Stack.Pop;
  ShowMessage(Format(
'%s, %d', [rec.Name, rec.Age]));
  Text :
= Format('当前队列成员总数: %d', [Stack.Count]);

  
{让 Memo1 配合显示}
  Memo1.Lines.Delete(Memo1.Lines.Count 
- 1);
end;

{下一个出列的的元素: Peek}
procedure TForm1.Button3Click(Sender: TObject);
var
  rec: TRec;
begin
  
if Stack.Count = 0 then Exit;
  rec :
= Stack.Peek;
  ShowMessage(Format(
'%s, %d', [rec.Name, rec.Age]));
end;

end.

 

 

 

ContractedBlock.gif ExpandedBlockStart.gif dfm
object Form1: TForm1
  Left 
= 0
  Top 
= 0
  Caption 
= 'Form1'
  ClientHeight 
= 147
  ClientWidth 
= 284
  Color 
= clBtnFace
  Font.Charset 
= DEFAULT_CHARSET
  Font.Color 
= clWindowText
  Font.Height 
= -11
  Font.Name 
= 'Tahoma'
  Font.Style 
= []
  OldCreateOrder 
= False
  Position 
= poDesktopCenter
  OnCreate 
= FormCreate
  OnDestroy 
= FormDestroy
  PixelsPerInch 
= 96
  TextHeight 
= 13
  
object Memo1: TMemo
    Left 
= 0
    Top 
= 0
    Width 
= 121
    Height 
= 147
    Align 
= alLeft
    Font.Charset 
= DEFAULT_CHARSET
    Font.Color 
= clWindowText
    Font.Height 
= -13
    Font.Name 
= 'Courier New'
    Font.Style 
= []
    Lines.Strings 
= (
      
'Memo1')
    ParentFont 
= False
    ScrollBars 
= ssBoth
    TabOrder 
= 0
  
end
  
object Button1: TButton
    Left 
= 127
    Top 
= 21
    Width 
= 146
    Height 
= 25
    Caption 
= 'Button1'
    TabOrder 
= 1
    OnClick 
= Button1Click
  
end
  
object Button2: TButton
    Left 
= 127
    Top 
= 61
    Width 
= 146
    Height 
= 25
    Caption 
= 'Button2'
    TabOrder 
= 2
    OnClick 
= Button2Click
  
end
  
object Button3: TButton
    Left 
= 127
    Top 
= 99
    Width 
= 146
    Height 
= 25
    Caption 
= 'Button3'
    TabOrder 
= 3
    OnClick 
= Button3Click
  
end
end

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值