首页 > 其他分享 >delphi TFixedQueue 静态固定元素数队列,手工实现;

delphi TFixedQueue 静态固定元素数队列,手工实现;

时间:2024-12-15 11:09:21浏览次数:5  
标签:function Index 队列 delphi TFixedQueue FCount Integer

unit zx.core.FixedQueue;

interface

uses
  System.SysUtils, System.Generics.Collections;

type

  TFixedQueue<T> = class
  private
    /// <summary>
    /// 一个动态数组,用于存储队列元素,动态数组会自动管理内存
    /// </summary>
    FItems: TArray<T>;

    /// <summary>
    /// 头指针,指向队列的逻辑第一个元素
    /// </summary>
    FFront: Integer;

    /// <summary>
    /// 尾指针,指向队列的逻辑最后一个元素
    /// </summary>
    FRear: Integer;

    /// <summary>
    /// 当前队列中的元素数量
    /// </summary>
    FCount: Integer;

    /// <summary>
    /// 队列的固定容量
    /// </summary>
    FCapacity: Integer;

    /// <summary>
    /// 根据逻辑索引获取元素
    /// </summary>
    function GetItem(Index: Integer): T;

    /// <summary>
    /// 根据逻辑索引设置元素
    /// </summary>
    procedure SetItem(Index: Integer; const Value: T);

    /// <summary>
    /// 效仿官方的 TQueue
    /// </summary>
    function GetIsEmpty: Boolean; inline;
    function GetIsFull: Boolean; inline;
  public
    constructor Create(Capacity: Integer);

    procedure Enqueue(Item: T);
    function Dequeue: T;
    function Peek: T;

    property Count: Integer read FCount;
    property Capacity: Integer read FCapacity;

    property IsEmpty: Boolean read GetIsEmpty;
    property IsFull: Boolean read GetIsFull;

    /// <summary>
    /// 可以根据这个来遍历,注意 Index 其实是逻辑索引
    /// for var i = 0 to count - 1 ... item[i] 就遍历了
    /// </summary>
    property Items[Index: Integer]: T read GetItem write SetItem;
  end;

implementation

constructor TFixedQueue<T>.Create(Capacity: Integer);
begin
  if Capacity <= 0 then
    raise EArgumentOutOfRangeException.Create('容量必须大于0!');

  FCapacity := Capacity;
  SetLength(FItems, FCapacity);
  FFront := 0;
  FRear := -1;
  FCount := 0;
end;

procedure TFixedQueue<T>.Enqueue(Item: T);
begin
  if FCount = FCapacity then
    raise Exception.Create('队列已满,新入队失败!');

  FRear := (FRear + 1) mod FCapacity;
  FItems[FRear] := Item;
  Inc(FCount);
end;

function TFixedQueue<T>.Dequeue: T;
begin
  if FCount = 0 then
    raise Exception.Create('队列是空,无法出队!');

  Result := FItems[FFront];
  FFront := (FFront + 1) mod FCapacity;
  Dec(FCount);
end;

function TFixedQueue<T>.Peek: T;
begin
  if FCount = 0 then
    raise Exception.Create('队列是空,无法 Peek!');

  Result := FItems[FFront];
end;

function TFixedQueue<T>.GetItem(Index: Integer): T;
begin
  if (Index < 0) or (Index >= FCount) then
    raise EArgumentOutOfRangeException.Create('队列索引越界!');

  Result := FItems[(FFront + Index) mod FCapacity];
end;

procedure TFixedQueue<T>.SetItem(Index: Integer; const Value: T);
begin
  if (Index < 0) or (Index >= FCount) then
    raise EArgumentOutOfRangeException.Create('队列索引越界!');

  FItems[(FFront + Index) mod FCapacity] := Value;
end;

function TFixedQueue<T>.GetIsEmpty: Boolean;
begin
  Result := FCount = 0;
end;

function TFixedQueue<T>.GetIsFull: Boolean;
begin
  Result := FCount = FCapacity;
end;

end.

标签:function,Index,队列,delphi,TFixedQueue,FCount,Integer
From: https://www.cnblogs.com/del88/p/18607788

相关文章

  • 使用任务队列TaskQueue和线程池ThreadPool技术实现自定义定时任务框架详解
    前言在桌面软件开发中,定时任务是一个常见的需求,比如定时清理日志、发送提醒邮件或执行数据备份等操作。在C#中有一个非常著名的定时任务处理库Hangfire,不过在我们深入了解Hangfire之前,我们可以手动开发一个定时任务案例,用以帮助我们理解Hangfire的核心原理。我们可以利用......
  • FreeRTOS-(2)-队列
    一、什么是队列?    队列又称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任务间传递信息。    为什么不使用全局变量?    如果使用全局变量,任务1 修改了变量a,等待任务3处理,但任务3处理速度很慢,在......
  • 任务延时队列
    目录现有问题延时队列设计设计实现现有问题每次时钟节拍都需要扫描所有任务,比较耗时不易支持多个任务具有相同优先级延时队列设计将所有需要延时的任务单独放置在一个队列中,每次发生系统节拍时,只需扫描该队列。方式一:独立保存延时时间插入延时任务比较简单,快......
  • 【Linux】:多线程(POSIX 信号量 、基于环形队列的生产消费者模型)
    ......
  • 开拓计划1 - 栈与队列
    开拓计划1-栈与队列栈与队列的概念及作用栈的概念Q:什么是栈?A:栈是一种后进先出(BIFO)的数据结构。栈的作用Q:栈有什么作用?A:只要满足栈的定义的场景都可以使用栈。eg:括号匹配,火车进站etc.计算后缀表达式时也会使用。队列的概念Q:什么是队列?A:队列是一种先进先......
  • ‌Bull是一个基于Redis的队列库,专为Node.js设计
    ‌Bull是一个基于Redis的队列库,专为Node.js设计,提供高性能和可靠的任务处理能力‌。它通过Redis作为后端存储,确保任务的持久性和高可用性。Bull的设计理念是简单、高效,同时具备强大的功能,能够满足各种复杂的任务调度需求‌12。Bull的主要功能‌高性能‌:Bull采用无轮询设计,极大......
  • 使用C语言实现队列:基础与实践
    队列(Queue)是一种常见的数据结构,遵循“先进先出”(FIFO,FirstInFirstOut)的原则。队列在许多计算机科学领域中有着广泛的应用,例如任务调度、缓冲区管理等。本文将以C语言为例,详细介绍如何实现一个简单的队列,包括两种主要实现方式:基于数组和基于链表的实现。队列的基本操作一个队......
  • 四大主流消息队列 场景化选型指导:kafka、rocketmq、rabbitmq、pulsar
    探讨消息队列在软件开发中的应用与选择在日常的软件开发过程中,我们常常会遇到系统间的异步通信、流量削峰填谷、日志收集等需求。这时,消息队列就成为了解决这类问题的有效工具之一。比如,在电商平台中,当用户下单时,订单信息不仅需要立即保存到数据库中,还需要同步更新库存、生成物流......
  • 记录真实项目中遇到的bug--018:消息队列bug
    T18:消息队列BUG:1.优先级:T22.需求详情:CRM系统中客户有“优质客户”标签,创建订单时,打“优质订单标签”,历史数据不做处理。3.前提条件:(一)点击创建订单,除下单客户外,其他必填项填完(二)存在一笔带有“首单客户”标签的订单4.操作步骤:(一)下单客户选择带有“优质”标签(二)点击提交......
  • 1、消息队列框架:RabbitMQ - 开源项目研究文章
    RabbitMQ是一个开源的消息代理和队列服务器,它使用AMQP(高级消息队列协议)来实现跨语言和跨平台的消息传递。它由Erlang语言编写,支持多种消息队列协议,如STOMP和MQTT,并且提供了多种语言的客户端支持。RabbitMQ的核心组件包括Broker、VirtualHost、Connection、Chan......