队列作为线性表的另一个数据结构,只允许在表的前端进行删除操作,而在表的后端进行插入操作,和栈一样,队列是一种操作受限制的线性表。

先来看下用法:

            Queue queue = new Queue();
queue.Enqueue(1);
queue.Enqueue(2);
queue.Enqueue(3);
queue.Enqueue(4);
foreach (var r in queue)
{
Console.Write($"data:{r} ");
}
Console.WriteLine();
Console.WriteLine($"peek:{queue.Peek()}");
queue.Dequeue();
queue.Enqueue(5);
queue.Enqueue(6);
Console.WriteLine();

打印结果:

    public class MyQueue
{
/// <summary>
/// 存储栈结构
/// </summary>
public object[] content { get; set; }
/// <summary>
/// 队列第一个节点
/// </summary>
public int head { get; set; }
/// <summary>
/// 对列最后一个节点
/// </summary>
public int tail { get; set; }
/// <summary>
/// 队列长度
/// </summary>
public int size { get; set; }
/// <summary>
/// 增长因子 100 == 1.0
/// </summary>
public int growFactor { get; set; }
/// <summary>
/// 最小增加量
/// </summary>
private const int minimumGrow = 4;
private const int _ShrinkThreshold = 32;
/// <summary>
/// 初始化
/// </summary>
public MyQueue()
: this(32, (float)2.0)
{
}
/// <summary>
///
/// </summary>
/// <param name="capacity">队列长度</param>
/// <param name="growFactor">增长因子</param>
public MyQueue(int capacity, float _growFactor)
{
if (capacity < 0)
throw new ArgumentOutOfRangeException("参数错误");
if (!(_growFactor >= 1.0 && _growFactor <= 10.0))
throw new ArgumentOutOfRangeException("增长因子不在范围内");
content = new Object[capacity];
head = 0;
tail = 0;
size = 0;
growFactor = (int)(_growFactor * 100);
}
/// <summary>
/// 在队列尾处添加节点
/// </summary>
/// <param name="obj"></param>
public virtual void Enqueue(object obj)
{
if (size == content.Length)
{
//计算扩展后的队列长度
int newCapacity = (int)(content.Length * growFactor / 100);
if (newCapacity < content.Length + newCapacity)
{
newCapacity = content.Length + minimumGrow;
}
SetCapacity(newCapacity);
}
content[tail] = obj;
tail = (tail + 1) % content.Length;
size++;
}
/// <summary>
/// 在队列头部出栈
/// </summary>
/// <returns></returns>
public virtual Object Dequeue()
{
if (size == 0)
throw new IndexOutOfRangeException("空队列");
object rem = content[head];
content[head] = null;
head = (head + 1) % content.Length;
size--;
return rem;
}
public virtual Object Peek()
{
if (size == 0)
throw new IndexOutOfRangeException("空队列");
return content[head];
}
/// <summary>
/// 扩展队列
/// </summary>
/// <param name="capacity"></param>
private void SetCapacity(int capacity)
{
object[] newArray = new object[capacity];
if (size > 0)
{
if (head < tail)
{
Array.Copy(content, head, newArray, 0, size);
}
else
{
Array.Copy(content, head, newArray, 0, content.Length - head);
Array.Copy(content, 0, newArray, content.Length - head, head);
}
}
content = newArray;
head = 0;
tail = (size == capacity) ? 0 : size;
}
public void ShowAll()
{
for (int i = head; i < size; i++)
{
Console.Write($"index:{i},data:{content[i]} ");
}
Console.WriteLine("——————————————————————");
}
}

测试:

            MyQueue queue = new MyQueue();
queue.Enqueue(1);
queue.Enqueue(2);
queue.Enqueue(3);
queue.Enqueue(4);
queue.ShowAll();
Console.WriteLine($"peek:{queue.Peek()}");
queue.Dequeue();
queue.Enqueue(5);
queue.Enqueue(6);
queue.ShowAll();
Console.ReadLine();

实现方式:

通过object对象数组,存储队列中的节点数据,另外定义两个指针分别指向队列的头部节点以及尾部节点。

Enqueue入队时,(如果队列长度达到数组最大长度,则通过扩展数组(队列长度 * 增长因子)来增加数组长度)通过在对尾附加节点来实现的。

Dequeue出队时,通过头指针后移实现出队列。

另外未实现地方,为节省内存空间,数组中出队后的空间也要加入到后续入队时用到的闲置位置。

以上方法都是以虚方法的方式实现的,便于后续重写(例如线程安全队列)。

打印结果:


C#数据结构-队列的更多相关文章

  1. java 数据结构 队列的实现

    java 数据结构队列的代码实现,可以简单的进行入队列和出队列的操作 /** * java数据结构之队列的实现 * 2016/4/27 **/ package cn.Link; import java ...

  2. C++ 泛型 编写的 数据结构 队列

    平时编程里经常需要用到数据结构,比如  栈和队列 等,  为了避免每次用到都需要重新编写的麻烦现将  C++ 编写的 数据结构 队列  记录下来,以备后用. 将 数据结构  队列  用头文件的形式写成 ...

  3. C语言数据结构-队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作

    1.数据结构-队列的实现-C语言 //队列的存储结构 #define MAXSIZE 100 typedef struct { int* base; //基地址 int _front; //头指针 i ...

  4. java数据结构——队列、循环队列(Queue)

    每天进步一点点,坚持就是成功. 1.队列 /** * 人无完人,如有bug,还请斧正 * 继续学习Java数据结构————队列(列队) * 队列和栈一样,都是使用数组,但是队列多了一个队头,队头访问数 ...

  5. [从今天开始修炼数据结构]队列、循环队列、PriorityQueue的原理及实现

    [从今天开始修炼数据结构]基本概念 [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList [从今天开始修炼数据结构]栈.斐波那契数列.逆波兰四则运 ...

  6. (js描述的)数据结构[队列结构,优先级队列](3)

    (js描述的)数据结构[队列结构](3) 一.队列结构的特点: 1.基于数组来实现,的一种受限的线性结构. 2.只允许在表头进行删除操作,在表尾进行插入操作. 3.先进先出(FIFO) 二.队列的一些 ...

  7. 数据结构--队列(Java实现)

    数据结构--队列(Java实现) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 简介 队列是一种特殊的线性表,特殊之处在于它只 ...

  8. 数据结构--队列之C数组实现

    队列是一种限定操作的线性表,它只能在表的一段插入,另外一段取出.所以也称为先进先出数据结构(FIFO---First In First Out) C代码如下: #include<stdio.h& ...

  9. JavaScript数据结构——队列的实现

    前面楼主简单介绍了JavaScript数据结构栈的实现,http://www.cnblogs.com/qq503665965/p/6537894.html,本次将介绍队列的实现. 队列是一种特殊的线性 ...

  10. 用go实现常用算法与数据结构——队列(queue)

    queue 简介 队列是一种非常常见的数据结构,日常生活中也能经常看到.一个典型的队列如下图(图片来自 segmentfault): 可以看出队列和我们日常生活中排队是基本一致的.都遵循 FIFO(F ...

随机推荐

  1. [LeetCode]55. 跳跃游戏(贪心)

    题目 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: tr ...

  2. 阿里云服务器外网IP无法访问网站

    1.添加IIS时添加了127.0.0.1的IP监听导致无法访问外网IP 添加IP监听:netsh http add iplisten 127.0.0.1显示IP监听:netsh http show i ...

  3. Express下ejs的视图模板引擎的建立

    写在前面 由于Express升级到4.0,将ejs的用法忽略,改为用户自定义形式,所以要引入库index.js作为引擎,来支持ejs的模板引擎(点击下载). 首先是建立一个名字叫nodeitem,引擎 ...

  4. Redis安装即python使用

    一:简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted ...

  5. SpringMVC初始化阶段流程源码分析

    1.都知道SpringMVC项目启动的时候都会初始化一个类:DispatcherServlet,看这个类的源码我们可以发现他其实就是一个servlet, 为什么这么说呢?请看: DispatcherS ...

  6. Laravel Exception结合自定义Log服务的使用

    Laravel Exception结合自定义Log服务的使用 第一部分:laravel关于错误和异常的部分源码 第二部分:自定义异常的使用(结合serviceprovider monolog elas ...

  7. 虚拟机堆(Heap)的基础知识

    概述 一个进程对应一个JVM实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器.本地方法栈和虚拟机栈 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核 ...

  8. Group Convolution组卷积

    思路按照常规卷积到组卷积来. 常规卷积: 如果输入feature map尺寸为C∗H∗W C*H*WC∗H∗W,卷积核有N NN个,输出feature map与卷积核的数量相同也是N NN,每个卷积核 ...

  9. Apache HTTP Server 2.2.34安装

    Windows 下载 安装方式有自己编译源码和下载别人编译好的,这里选择从第三方下载,官网地址http://mirrors.tuna.tsinghua.edu.cn/apache//httpd/bin ...

  10. 排序算法:归并排序(Merge Sort)

    归并排序 归并排序采用了分治策略(divide-and-conquer),就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解. 归并排序将排序数组A[1. ...