.Net中队列类的操作与系统队列类queue的使用

简介: class MyQueue { //存放元素的数组 private object[] _array; //增长因子 private int _growFactor;...
    class MyQueue
    {
        //存放元素的数组
        private object[] _array;
        //增长因子
        private int _growFactor;

        //队头下标
        private int _head;
        //队尾下标
        private int _tail;
        private int _size;

        private const int _MinGrow = 4;
        //初始容量
        private const int _ShrikThreadhold = 0x20;

        public MyQueue()
            : this(_ShrikThreadhold, 2f)
        {
        }

        public MyQueue(int capacity, float growFactor)
        {
            if (capacity < 0)
            {
                throw new ArgumentOutOfRangeException("capacity", "初始容量不能为负!");
            }
            if ((growFactor < 1.0) || (growFactor > 10))
            {
                throw new ArgumentOutOfRangeException("growFactor", "增长因子应介于1和10之间!");
            }
            this._array = new object[capacity];
            this._head = 0;
            this._size = 0;
            this._tail = 0;
            this._growFactor = (int)(growFactor * 100f);
        }

        //入队
        public virtual void Enqueue(object obj)
        {

            if (this._size == this._array.Length)
            {//队列已满
                int capacity = (int)((this._array.Length * this._growFactor) / 100L);
                if (capacity < (this._array.Length + _MinGrow))
                {
                    capacity = this._array.Length + _MinGrow;
                }
                SetCapacity(capacity);
            }
            this._array[this._tail] = obj;
            this._tail = (this._tail + 1) % this._array.Length;
            this._size++;
        }

        //内存设置
        private void SetCapacity(int capacity)
        {
            object[] dest = new object[capacity];
            if (this._head < this._tail)//尾指针在头指针后
            {
                Array.Copy(this._array, this._head, dest, 0, this._size);
            }
            else//头指针在尾指针后
            {
                Array.Copy(this._array, this._head, dest, 0, this._array.Length - this._head);
                Array.Copy(this._array, 0, dest, this._array.Length - this._head, this._tail);
            }

            this._array = dest;
            this._head = 0;
            this._tail = (this._size == capacity) ? 0 : this._size;
        }


        //出队
        public virtual object Dequeue()
        {
            if (this._size == 0)
            {
                throw new InvalidOperationException("队列为空");

            }
            object obj = this._array[this._head];//出队
            this._array[this._head] = null;
            this._head = (this._head + 1) % this._array.Length;
            this._size--;
            return obj;
        }
        public virtual int Count
        {
            get { return this._size; }
        }
    }



        static void Main(string[] args)
        {

            Program main = new Program();
            main.testQueue();
        }
        private void testQueue()
        {
            Queue<int> myQueue = new Queue<int>();
            //MyQueue myQueue = new MyQueue();//与上面类使用一样
            myQueue.Enqueue(1);
            myQueue.Enqueue(2);
            myQueue.Enqueue(3);
            myQueue.Enqueue(4);

            Console.WriteLine("总数量:"+myQueue.Count.ToString());
            while (myQueue.Count > 0)
            {
                Console.WriteLine("出列:"+myQueue.Dequeue());
            }
            Console.WriteLine("数量:"+myQueue.Count.ToString());
            Console.ReadLine();
        }



相关文章
|
1月前
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
|
26天前
|
关系型数据库 C# 数据库
.NET 8.0 开源在线考试系统(支持移动端)
【10月更文挑战第27天】以下是适用于 .NET 8.0 的开源在线考试系统(支持移动端)的简介: 1. **基于 .NET Core**:跨平台,支持多种数据库,前后端分离,适用于多操作系统。 2. **结合 Blazor**:使用 C# 开发 Web 应用,支持响应式设计,优化移动端体验。 3. **基于 .NET MAUI**:跨平台移动应用开发,一套代码多平台运行,提高开发效率。 开发时需关注界面设计、安全性与稳定性。
|
24天前
.NET 4.0下实现.NET4.5的Task类相似功能组件
【10月更文挑战第29天】在.NET 4.0 环境下,可以使用 `BackgroundWorker` 类来实现类似于 .NET 4.5 中 `Task` 类的功能。`BackgroundWorker` 允许在后台执行耗时操作,同时不会阻塞用户界面线程,并支持进度报告和取消操作。尽管它有一些局限性,如复杂的事件处理模型和不灵活的任务管理方式,但在某些情况下仍能有效替代 `Task` 类。
|
1月前
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
|
2月前
|
JSON 安全 数据安全/隐私保护
从0到1搭建权限管理系统系列三 .net8 JWT创建Token并使用
【9月更文挑战第22天】在.NET 8中,从零开始搭建权限管理系统并使用JWT(JSON Web Tokens)创建Token是关键步骤。JWT是一种开放标准(RFC 7519),用于安全传输信息,由头部、载荷和签名三部分组成。首先需安装`Microsoft.AspNetCore.Authentication.JwtBearer`包,并在`Program.cs`中配置JWT服务。接着,创建一个静态方法`GenerateToken`生成包含用户名和角色的Token。最后,在控制器中使用`[Authorize]`属性验证和解析Token,从而实现身份验证和授权功能。
139 3
|
1月前
|
API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
25 0
|
3月前
|
设计模式 存储 前端开发
揭秘.NET架构设计模式:如何构建坚不可摧的系统?掌握这些,让你的项目无懈可击!
【8月更文挑战第28天】在软件开发中,设计模式是解决常见问题的经典方案,助力构建可维护、可扩展的系统。本文探讨了.NET中三种关键架构设计模式:MVC、依赖注入与仓储模式,并提供了示例代码。MVC通过模型、视图和控制器分离关注点;依赖注入则通过外部管理组件依赖提升复用性和可测性;仓储模式则统一数据访问接口,分离数据逻辑与业务逻辑。掌握这些模式有助于开发者优化系统架构,提升软件质量。
55 5
|
3月前
|
缓存 程序员
封装一个给 .NET Framework 用的内存缓存帮助类
封装一个给 .NET Framework 用的内存缓存帮助类
|
3月前
|
C# Windows 开发者
超越选择焦虑:深入解析WinForms、WPF与UWP——谁才是打造顶级.NET桌面应用的终极利器?从开发效率到视觉享受,全面解读三大框架优劣,助你精准匹配项目需求,构建完美桌面应用生态系统
【8月更文挑战第31天】.NET框架为开发者提供了多种桌面应用开发选项,包括WinForms、WPF和UWP。WinForms简单易用,适合快速开发基本应用;WPF提供强大的UI设计工具和丰富的视觉体验,支持XAML,易于实现复杂布局;UWP专为Windows 10设计,支持多设备,充分利用现代硬件特性。本文通过示例代码详细介绍这三种框架的特点,帮助读者根据项目需求做出明智选择。以下是各框架的简单示例代码,便于理解其基本用法。
165 0
|
3月前
|
开发框架 NoSQL .NET
使用 Asp.net core webapi 集成配置系统,提高程序的灵活和可维护性
使用 Asp.net core webapi 集成配置系统,提高程序的灵活和可维护性