C#实现泛型动态循环数组队列的方法

任务

循环数组

实现目标:(1)创建一个新的数组数据结构;

     (2)该数据结构为泛型;

     (3)可以按照元素多少进行扩容缩容;

     (4)进行添加删除操作的时间复杂度小于O(n);

优势:在取出放入的操作中消耗的资源更少

劣势:取出特定元素或特定下标元素平均消耗的资源为普通数组平均消耗资源的最大值

循环数组队列

实现目标:(1)根据循环数组构建出循环的队列数据结构

优势:节省资源,运行速度快;

劣势:不能灵活取出

重点:如何实现循环的计算下标语句。

循环下标语句

完整代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DataStructrue
{
    /// <summary>
    /// 循环数组
    /// (1)添加功能
    /// (2)删除功能
    /// (3)查询(任何、首尾处)功能
    /// (4)修改(任何,首位处)功能
    /// </summary>
    /// <typeparam name="E"></typeparam>
    class Array2<E>
    {
        private E[] data;
        private int N;
        private int first;
        private int last;
        public Array2(int capacity)
        {
            data = new E[capacity];
            N = 0;
            first = 0;
            last = 0;
        }
        public Array2() : this(10) { }
        public int Count { get { return N; } }
        public bool IsEmpty { get { return N==0; } }
        public E GetFirst()
            return data[first];
        /// <summary>
        /// 添加一个元素
        /// </summary>
        /// <param name="e"></param>
        public void Add(E e)
            if (N==data.Length)
            {
                ResetCapacity(data.Length*2);
            }
            data[last] = e;
            last = (last + 1) % data.Length;
            N++;
        /// 移除早放进的一个元素
        /// <returns></returns>
        public E RemoveLast()
            if (N==0)
                throw new ArgumentException("队列已空");
            if (N<=(data.Length/4))
                ResetCapacity(data.Length / 2);
            E de = data[first];
            data[first] = default;
            first = (first + 1) % data.Length;
            N--;
            return de;
        /// 移除特定下标元素
        /// 消耗大,不建议使用
        /// <param name="index"></param>
        public E RemoveAt(int index)
            if (index > data.Length || index < 0 ||N==0)
                throw new ArgumentException("非法索引");
            if (first > last)
                if (index < first && index >= last)
                {
                    throw new ArgumentException("非法索引");
                }
            else if (last > first)
            E rd = data[index];
            for (int i = index+1; i !=last ; i=(i+1)%data.Length)
                data[i-1] = data[i];
            last--;
            return rd;
        /// 移除特定元素
        public E Remove(E e)
            for (int i = first; i !=last; i=(i+1)%data.Length)
                if (data[i].Equals(e))
                    return RemoveAt(i);
            return data[last];
        /// 对数组进行扩容操作
        /// <param name="newcapacity"></param>
        private void ResetCapacity(int newcapacity)
            E[] data2 = new E[newcapacity];
            for (int i = 0; i < N; i++)
                data2[i] = data[first];
                first = (first + 1) % data.Length;
                last = i+1;
            data = data2;
        public override string ToString()
            //实例化
            StringBuilder res = new();
            //重写格式1:输出数组元素个数以及长度
            //res.Append(string.Format("Array1:   count={0}    capacity={1}\n",N,data.Length));
            res.Append(string.Format("A2Queue: Count = {0} Capacity = {1}\n[", N, data.Length));
                res.Append(data[(first+i)%data.Length]);
                if (i!=N-1)
                    res.Append(',');
            res.Append(']'+"\n");
            //返回
            return res.ToString();
    }
}

补充:c#使用数组实现泛型队列Quque<T>,以循环的方式使用数组提高性能

队列简述

一种先进先出的数据结构

本文主旨

  • 提供一个确定容量的高性能队列的实现
  • 更进一步可以对队列做动态扩容,每次队列满了的时候增加队列容量
  • 队列也可以使用链表实现

实现代码

using System;

namespace DataStructure
{
    /// <summary>
    /// 用数组实现队列
    /// 用2个index标记开始合结束
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class ArrayQueue<T>
    {
        private int mCapicity;
        private int mStartIndex;
        private int mEndIndex;
        private int mCount;
        private T[] mArray;
        public ArrayQueue(int capicity)
        {
            mCapicity = capicity;
            mArray = new T[capicity];
        }
        public int Count
            get
            {
                return mCount;
            }
        public bool IsFull
                return mCount == mCapicity;
        public int Capicity
            get { return mCapicity; }
        public bool IsEmpty
                return mCount == 0;
        public void Clear()
            mStartIndex = 0;
            mEndIndex = 0;
            mCount = 0;
            mCapicity = 0;
            mArray = null;
        public void Enqueue(T e)
            //队列满了
            if (IsFull)
                throw new Exception("queue is full");
            mArray[mEndIndex] = e;
            mCount++;
            //计算下一个位置
            mEndIndex++;
            if (mEndIndex == mCapicity)
                mEndIndex = 0;
        public T Dequeue()
            //队列空
            if (IsEmpty)
                throw new Exception("queue is empty");
            var r = mArray[mStartIndex];
            //计算下一次取元素的index
            //取出元素后增加start
            mStartIndex++;
            //到达尾部,开始循环,下一次从头开始取
            if (mStartIndex == mCapicity)
                mStartIndex = 0;
            mCount--;
            return r;
    }
}

测试代码

namespace DataStructure
{
    public class ArrayQueueTest : BaseSolution
    {
        public void Test()
        {
            var queue = new ArrayQueue<int>(4);
            queue.Enqueue(1);
            queue.Enqueue(2);
            queue.Enqueue(3);
            queue.Enqueue(4);
            // println(queue.Capicity);
            // println(queue.Count);

            println(queue.Dequeue());
            queue.Enqueue(5);
            while (!queue.IsEmpty)
            {
                println(queue.Dequeue());
            }
        }
    }
}

到此这篇关于C#实现泛型动态循环数组队列的文章就介绍到这了,更多相关C#泛型动态循环数组队列内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • c#泛型序列化对象为字节数组的示例

    序列化对象为字节数组 复制代码 代码如下: using System.IO;using System.Runtime.Serialization.Formatters.Binary;        protected byte[] Serialize<T>(T t)        {            MemoryStream mStream = new MemoryStream();            BinaryFormatter bFormatter = new BinaryFo

  • C#中数组Array,ArrayList,泛型List详细对比

    在C#中数组Array,ArrayList,泛型List都能够存储一组对象,但是在开发中根本不知道用哪个性能最高,下面我们慢慢分析分析. 一.数组Array 数组是一个存储相同类型元素的固定大小的顺序集合.数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合. Array 类是 C# 中所有数组的基类,它是在 System 命名空间中定义. 数组在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也非常简单. Array数组具体用法: using System; names

  • C#控制台基础 List泛型集合与对应的数组相互转换实现代码

    核心代码: using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication10 { class Program { static void Main(string[] args) { List<int> list = new List&l

  • C#实现泛型动态循环数组队列的方法

    任务 循环数组 实现目标:(1)创建一个新的数组数据结构; (2)该数据结构为泛型; (3)可以按照元素多少进行扩容缩容; (4)进行添加删除操作的时间复杂度小于O(n); 优势:在取出放入的操作中消耗的资源更少 劣势:取出特定元素或特定下标元素平均消耗的资源为普通数组平均消耗资源的最大值 循环数组队列 实现目标:(1)根据循环数组构建出循环的队列数据结构 优势:节省资源,运行速度快: 劣势:不能灵活取出 重点:如何实现循环的计算下标语句. 循环下标语句 完整代码: using System;

  • Shell动态生成数组的多种方法

    如果对linux shell 数组不是很熟悉的话,请看上一篇文章:linux shell 数组建立及使用技巧  ,这篇文章主要讲是动态生成数组系列.方法应该很多,我这里主要以一个求和计算的题目为例进行分析. 题目:请用linux shell 写一段脚本,实现从1..1000中所有偶数的和值. 方法一: 通过while 循环得到需要的结果: start=1; total=0; while [ $start -le 1000 ];do [[ $(($start%2)) == 0 ]]&&tot

  • C#动态调整数组大小的方法

    本文实例讲述了C#动态调整数组大小的方法.分享给大家供大家参考.具体如下: 通常,我们创建一个数组后就不能调整其长度,但是Array类提供了一个静态方法CreateInstance用来创建一个动态数组,所以我们可以通过它来动态调整数组的长度. namespace ArrayManipulation { Class Program { static void Main (String[] args) { int[] arr = new int[]{1,2,3}; PrintArr(arr); ar

  • Jquery 动态循环输出表格具体方法

    实现功能:1.有一个同学叫我实现一个这样的功能就像PHP,在表单中输入数字,然后网页就出现相应的数量:如果是PHP的话就简单多了,Jquery实现还是第一个,就开始狂的实验,最后还是实现了(知识点:Jquery创建节点.获取表单的值.循环语句)Jquery代码: 复制代码 代码如下: <script type="text/javascript" language="javascript">$(function(){$("#btn").

  • Java动态循环队列是如何实现的

    一.队列 1.1 定义 队列 (Queue) 是一种限定性的有序线性表,它只允许在表的一端插入元素,而在另一端删除元素,所以队列具有先进先出 (Fist In Fist Out,缩写为FIFO)的特性. 在队列中,允许插入的一端叫做队尾(rear): 允许删除的一端则称为队头(front). 队列是一个有序列表,可以用数组或是链表来实现. 遵循先进先出的原则.即:先存入队列的数据,要先取出. 1.2 抽象数据类型 数据元素:可以是任意类型的数据,但必须属于同一个数据对象. 关系:队列中数据元素之

  • 动态数组C++实现方法(分享)

    回顾大二的数据结构知识.从数组开始.实现了一个可自动扩充容量的泛型数组. 头文件:Array.h #ifndef Array_hpp #define Array_hpp template <class T> class Array{ private: T *base; //数组首地址 int length; //数组中元素 int size; //数组大小,以数组中元素的大小为单位 public: //初始化数组,分配内存 bool init(); //检查内存是否够用,不够用就增加 bool

  • C++数据结构之实现循环顺序队列

    数据结构–用C++实现循环顺序队列 队列的操作特性:先进先出 队列中元素具有相同类型 相邻元素具有前驱和后继关系 设置队头.队尾两个指针,以改进出队的时间性能 约定:队头指针front指向队头元素的前一个位置,队尾指针rear指向队尾元素 为了解决假溢出,我们将存储队列的数组头尾相接,从而产生了循环队列. 如何判断循环队列队空? 队空:front=rear 如何盘对循环队列堆满? 队满:front=rear 那么问题就来了,队空和队满的判断条件相同,为了避免队满时产生队空的判断或者相反,我们需要

  • java队列实现方法(顺序队列,链式队列,循环队列)

    双向顺序队列ArrayDeque和双向链式队列LinkedList,JDK已经包含,在此略.ArrayDeque包括顺序栈和顺序队列,LinkedList包含链式栈和链式队列.ArrayDeque和LinkedList都是线程不安全的.PriorityQueue优先队列也在JDK. 1.顺序队列的实现 package lang; import java.io.Serializable; import java.util.Arrays; /** * @ClassName: ArrayQueue *

  • Java数组队列概念与用法实例分析

    本文实例讲述了Java数组队列概念与用法.分享给大家供大家参考,具体如下: 一.队列的概念 (1)队列也是一种线性结构 (2)相比数组,队列对应的操作是数组的子集 (3)只允许在一端插入数据操作,在另一端进行删除数据操作,进行插入操作的一端称为队尾(入队列),进行删除操作的一端称为队头(出队列) (4)队列是一种先进先出的数据结构(FIFO) 此处我们先来学习一下顺序队列 ,顺序队列 就是用数组实现:比如有一个n个元素的队列,数组下标0的一端是队头,入队操作就是通过数组下标一个个顺序追加,不需要

  • Java数组队列及环形数组队列超详细讲解

    目录 一.队列 1.基本介绍 2.示意图 3.队列的特点 二.数组模拟队列 1.数组队列初始化 2.判断方法 3.增删改查的方法 4.注意 三.数组模拟环形队列 1.初始化 2.判断方法 3.增删改查的方法 一.队列 1.基本介绍 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的端称为队头. 2.示意图 3.队列的特点 先进先出: 在队列中插入一

随机推荐