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

📄 genalg.pas

📁 Motorola 集群通信系统中SDTS车载台PEI端测试程序
💻 PAS
字号:
unit GenAlg;

interface

uses
  SysUtils;

type
  EGenericAlg = class(Exception);

  TGenericStruct = class
  public
    function IsEmpty: Boolean; virtual; abstract;
  end;

  PQueueItem = ^TQueueItem;
  TQueueItem = record
    Data: Pointer;
    Next: PQueueItem;
  end;

  TQueue = class(TGenericStruct)
  private
    Head, Tail: PQueueItem;
  public
    destructor Destroy; override;
    function IsEmpty: Boolean; override;
    procedure Add(Data: Pointer);
    function Remove: Pointer;
  end;

  PStackItem = ^TStackItem;
  TStackItem = record
    Data: Pointer;
    Previous: PStackItem;
  end;

  TStack = class(TGenericStruct)
  private
    Top: PStackItem;
  public
    destructor Destroy; override;
    function IsEmpty: Boolean; override;
    procedure Push(Data: Pointer);
    function Pop: Pointer;
  end;

  PDoubleListItem = ^TDoubleListItem;
  TDoubleListItem = record
    Data: Pointer;
    Next, Previous: PDoubleListItem;
  end;

implementation

{ TQueue }

destructor TQueue.Destroy;
var
  TempItem: PQueueItem;
begin
  while (Head <> nil) do begin
    TempItem := Head^.Next;
    Dispose(Head);
    Head := TempItem;
  end;
  inherited Destroy;
end;

function TQueue.IsEmpty: Boolean;
begin
  Result := (Head = nil);
end;

procedure TQueue.Add(Data: Pointer);
var
  TempItem: PQueueItem;
begin
  New(TempItem);
  TempItem^.Data := Data;
  TempItem^.Next := nil;
  if (Head = nil) then
    Head := TempItem
  else
    Tail^.Next := TempItem;
  Tail := TempItem;
end;

function TQueue.Remove: Pointer;
var
  TempItem: PQueueItem;
begin
  if IsEmpty then
    raise EGenericAlg.Create('Queue is empty');
  Result := Head.Data;
  TempItem := Head;
  Head := Head^.Next;
  Dispose(TempItem);
end;

{ TStack }

destructor TStack.Destroy;
var
  TempItem: PStackItem;
begin
  while (Top <> nil) do begin
    TempItem := Top;
    Top := Top^.Previous;
    Dispose(TempItem);
  end;
  inherited Destroy;
end;

function TStack.IsEmpty: Boolean;
begin
  Result := (Top = nil);
end;

function TStack.Pop: Pointer;
var
  TempItem: PStackItem;
begin
  if IsEmpty then
    raise EGenericAlg.Create('Stack is empty');
  TempItem := Top;
  Result := TempItem^.Data;
  Top := TempItem^.Previous;
  Dispose(TempItem);
end;

procedure TStack.Push(Data: Pointer);
var
  TempItem: PStackItem;
begin
  New(TempItem);
  TempItem^.Data := Data;
  TempItem^.Previous := Top;
  Top := TempItem;
end;

{ TDoubleList }

end.

⌨️ 快捷键说明

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