⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 joedata.pas

📁 DELPHI实现的基于指针的堆栈和队列。可以用于实现结构的堆栈和队列。
💻 PAS
字号:
unit joeData;

interface

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

type
  TjoeStack = class(TComponent)
  private
    { Private declarations }
    FList: TList;
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published declarations }
    function PopData(): Pointer;
    procedure PushData(Data: Pointer);
    function GetDataCount(): integer;
    function FindData(Data: Pointer): integer;
    procedure Clear();
  property
    Count: integer read GetDataCount;
  end;

  TjoeFIFO = class(TComponent)
  private
    { Private declarations }
    FList: TList;
    FStart: integer;
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published declarations }
    function GetData(): Pointer;
    procedure PutData(Data: Pointer);
    function GetDataCount(): integer;
    function FindData(Data: Pointer): integer;
    procedure Clear();
  property
    Count: integer read GetDataCount;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('joe Controls', [TjoeStack]);
  RegisterComponents('joe Controls', [TjoeFIFO]);
end;

constructor TjoeStack.Create(AOwner: TComponent);
begin
  inherited;
  FList := TList.Create();
end;

destructor TjoeStack.Destroy;
begin
  FList.Free();
  inherited;
end;

function TjoeStack.PopData(): Pointer;
begin
  if FList.Count = 0 then
    Result := nil // no data in stack
  else
  begin
    Result := FList[FList.Count-1];
    FList.Count := FList.Count-1;
  end;
end;

procedure TjoeStack.PushData(Data: Pointer);
begin
  FList.Add(Data);
end;

function TjoeStack.GetDataCount(): integer;
begin
  Result := FList.Count;
end;

function TjoeStack.FindData(Data: Pointer): integer;
var
  i: integer;
begin
  for i := 0 to FList.Count-1 do
    if FList[i] = Data then
    begin
      Result := i;
      Exit;
    end;
  Result := -1;
end;

procedure TjoeStack.Clear();
begin
  FList.Clear();
end;

constructor TjoeFIFO.Create(AOwner: TComponent);
begin
  inherited;
  FList := TList.Create();
  FStart := 0;
end;

destructor TjoeFIFO.Destroy;
begin
  FList.Free();
  inherited;
end;

function TjoeFIFO.GetData(): Pointer;
var
  i: integer;
begin
  if FList.Count > FStart then
  begin
    Result := FList[FStart];
    Inc(FStart);
    if FStart >= 64 then
    begin
      for i := FStart to FList.Count-1 do
        FList[i-FStart] := FList[i];
      FList.Count := FList.Count-FStart;
      FStart := 0;
    end;
  end
  else
    Result := nil // no data in stack
end;

procedure TjoeFIFO.PutData(Data: Pointer);
begin
  FList.Add(Data);
end;

function TjoeFIFO.GetDataCount(): integer;
begin
  Result := FList.Count - FStart;
end;

function TjoeFIFO.FindData(Data: Pointer): integer;
var
  i: integer;
begin
  for i := FStart to FList.Count-1 do
    if FList[i] = Data then
    begin
      Result := i;
      Exit;
    end;
  Result := -1;
end;

procedure TjoeFIFO.Clear();
begin
  FList.Clear();
  FStart := 0;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -