C#实现泛型动态循环数组队列的方法
作者:Mib_D 发布时间:2022-11-03 05:05:42
标签: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());
}
}
}
}
来源:https://www.cnblogs.com/yotomib/p/15854490.html
0
投稿
猜你喜欢
- 本文实例讲述了C#获取程序文件相关信息的方法,分享给大家供大家参考。具体实现方法如下:using System.Reflection;usi
- 目录原理实战原理其原理如图:1.配置数据源信息(包括表名)2.读取数据表字段信息:列名、类型、字段注释、表注释3.编写代码模板,并将该模板加
- webservice 可以用于分布式应用程序之间的交互,和不同程序之间的交互。概念性的东西就不说太多,下面开始创建一个简单的webservi
- 基础概念百度百科是这么描述归并排序的: 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。设有数列{6,
- 此方案适用于解决springboot项目运行时动态添加数据源,非静态切换多数据源!!!一、多数据源应用场景:1.配置文件配置多数据源,如默认
- 这篇文章主要介绍了Java实现inputstream流的复制代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- .c 源程序 ----- 编译 ----- 链接 ---- exe ----运行 -------->程序翻译环境和执行环境翻译环境:源
- C# 泛型(Generic)定义:泛型允许我们延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。也就是说,泛型是可
- 首先我们要做的就是先把IIS(Internet信息服务)打开,我用的是win8 的系统,所以这里以win8系统的操作来讲一、IIS的一些事先
- Android传感器概述:动作传感器、环境传感器、位置传感器等,如方向传感器(电子罗盘)、重力传感器(横纵切换)。Android SDK支持
- 起源最近公司要做多租户,Mybatis-Plus的多租户插件很好用,但是有一个场景是:字典表或者某些数据表,一些数据需要在各个租户之间共享,
- 使用 transient 修饰private transient String noColumn;使用 static 修饰private s
- 树的结构说得差不多了,现在我们来说说一种数据结构叫做哈希表(hash table),哈希表有是干什么用的呢?我们知道树的操作的时间复杂度通常
- 前言当指执行插入排序、希尔排序、归并排序等算法时,比较两个对象“大小”的比较操作。我们很容易理解整型的 i>j 这样的比较方式,但当我
- 大多数浏览器会对同一域名的请求限制请求数量,一般是在8个以内。每次最多可以同时请求8个,要是资源多于8个,那么剩下的就要排队等待请求了。所以
- 目录字节输入流字节输入流结构图FileInputStream类构造方法:常用读取方法:字节输出流字节输出流结构图:FileOutputStr
- 简介Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特
- 初次遇见 native是在 java.lang.Object 源码中的一个hashCode方法:public native int hash
- 前言最近使用QT中的QTextEdit控件,作为实时数据显示的UI,在一次写入超过多少k的时候循环写入则会卡顿,网上也没有什么好的解决方案,
- 一个简单的Java web服务器实现,比较简单,基于java.net.Socket和java.net.ServerSocket实现;一、程序