泛型容器单元(Generics.Collections)[3]: TStack<T> 堆栈列表

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

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



本例效果图:



代码文件:


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.


窗体文件:


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
时间: 2024-10-28 16:10:30

泛型容器单元(Generics.Collections)[3]: TStack<T> 堆栈列表的相关文章

泛型容器单元(Generics.Collections)[2]: TQueue&lt;T&gt; 队列列表

TQueue 和 TStack, 一个是队列列表, 一个是堆栈列表; 一个是先进先出, 一个是先进后出. TQueue 主要有三个方法.一个属性:Enqueue(入列).Dequeue(出列).Peek(查看下一个要出列的元素);Count(元素总数). 本例效果图: 代码文件: unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dia

Delphi 2009 泛型容器单元(Generics.Collections)[1]: TList&lt;T&gt;

Delphi 2009 新增了泛型容器单元: Generics.Collections, 同时还有一个 Generics.Defaults 单元做支持. Generics.Collections 包含了以下实用类:TList<T>TQueue<T>TStack<T>TDictionary<TKey,TValue>TObjectList<T>TObjectQueue<T>TObjectStack<T>TObjectDicti

从头认识java-13.11 对比数组与泛型容器,观察类型擦除给泛型容器带来什么问题?

这一章节我们继续类型擦除的话题,我们将通过对比数组与泛型容器,观察类型擦除给泛型容器带来什么问题? 1.数组 package com.ray.ch13; public class Test { public static void main(String[] args) { Fruit[] fruits = new Apple[5]; fruits[0] = new Apple(); fruits[1] = new Fuji(); fruits[2] = new Fruit(); } } cla

C++制作一个泛型容器(可以盛放各种类型的对象)

如果你想要一个可以盛放各种类型的对象,那么基本上可以说在C++里没有,或者你可以用vector<boost::any>或者其他的什么来模拟,我说那都不怎么好.问题就在于我的类型会在运行时动态的增加,你不可能知道我会增加什么类型,我的头文件也不会给你. 现在是不是觉得C++的泛型用不上了,是的,C++的泛型本质上是对相似代码的复用,做的事情都是同一件事情,但仅仅是处理类型的差别.这种情况用的还是比较少的,比如vector,queue,map等这些容器是用泛型的最好的地方了.但你想过没有,这些类型

从头认识java-13.11 对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题?

这一章节我们继续类型擦除的话题,我们将通过对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题? 1.数组 package com.ray.ch13; public class Test { public static void main(String[] args) { Fruit[] fruits = new Apple[5]; fruits[0] = new Apple(); fruits[1] = new Fuji(); fruits[2] = new Fruit(); } } cla

JAVA泛型容器的类型检查

泛型容器是通过指定容器包含对象的类型,由编译器保证对象类型的正确性,在编译阶段就能检查出类型错误.如下列将List<Long>对象longList赋予一个List<GenericTest>对象gtList,会报编译错误. public class GenericTest { public static List<Long> longList = Arrays.asList (1L ,2L); public static void main(String args[]){

数组与泛型容器区别

一.基本 class Shape{ void draw(){ System.out.println(this+".draw()"); } } class Circle extends Shape{ @Override public String toString() { return "Circle"; } } class Rect extends Shape{ @Override public String toString() { return "Re

C#中泛型容器Stack&lt;T&gt;的用法,以及借此实现&rdquo;撤销/重做&rdquo;功能

.Net为我们提供了众多的泛型集合.比如,Stack<T>先进后出,Queue<T>先进先出,List<T>集合元素可排序,支持索引,LinkedList<T>,双向链表的泛型实现,不支持索引;ISet<T>不允许被复制,他有2个实现,一个是HashSet<T>,不维持集合元素的排序,另一个是SortedSet<T>,支持集合元素的排序;IDictionary<TKey, TValue>是一个字典集合的泛型接口

8、泛型程序设计与c++标准模板库2.4列表容器

列表容器主要用于存放链表,其中的链表是双向链表,可以从任意一端开始遍历.列表容器是需要按顺序访问的容器.另外,列表容器不支持随机访问迭代器,因此某些算法不能适合于列表容器.列表容器还提供了另一种操作---拼接(splicing),其作用是将一个序列中的元素插入到另一个序列中.其头文件为<list> 1.列表容器的构造函数 4种形式的构造函数: list();//构造size()为0的列表容器 list(sizt_type n,const T& v=T());//初始化一个大小为n的列表