背景

上篇实现了一个简单的队列,内部使用了 _count 计数,本文采用另外一种模式,不用 _count 计数。

RingBuffer

不用 _count 计数的话,为了区分队列的满和空,需要在数组中预留一格,如下图就代表了一个满队列。

ArrayQueue

代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace DataStuctureStudy.Queues
  8. {
  9. public class ArrayQueue2<T>
  10. {
  11. private readonly int _maxSize;
  12. private readonly T[] _items;
  13. private int _header = ;
  14. private int _tail = -;
  15.  
  16. public ArrayQueue2(int size)
  17. {
  18. _maxSize = size + ;
  19. _items = new T[_maxSize];
  20. }
  21.  
  22. public void EnQueue(T item)
  23. {
  24. if (this.IsFull())
  25. {
  26. throw new InvalidOperationException("队列已满");
  27. }
  28.  
  29. if (_tail == _maxSize - )
  30. {
  31. _tail = -;
  32. }
  33.  
  34. _items[++_tail] = item;
  35. }
  36.  
  37. public T DeQueue()
  38. {
  39. if (this.IsEmpty())
  40. {
  41. throw new InvalidOperationException("队列已空");
  42. }
  43.  
  44. T item = _items[_header++];
  45.  
  46. if (_header == _maxSize)
  47. {
  48. _header = ;
  49. }
  50.  
  51. return item;
  52. }
  53.  
  54. public T Peek()
  55. {
  56. if (this.IsEmpty())
  57. {
  58. throw new InvalidOperationException("队列已空");
  59. }
  60.  
  61. return _items[_header];
  62. }
  63.  
  64. public bool IsFull()
  65. {
  66. return
  67. (_header + _maxSize - == _tail)
  68. ||
  69. (_tail + == _header);
  70. }
  71.  
  72. public bool IsEmpty()
  73. {
  74. return
  75. (_tail + == _header)
  76. ||
  77. (_header == && _tail == _maxSize - );
  78. }
  79.  
  80. public int Size()
  81. {
  82. if (_tail >= _header)
  83. {
  84. return _tail - _header + ;
  85. }
  86. else
  87. {
  88. return (_maxSize - _header) + (_tail + );
  89. }
  90. }
  91. }
  92. }

测试

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace DataStuctureStudy
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. var queue = new Queues.ArrayQueue2<int>();
  14.  
  15. queue.EnQueue();
  16. queue.EnQueue();
  17. queue.EnQueue();
  18. queue.EnQueue();
  19. queue.EnQueue();
  20. Console.WriteLine(queue.Size());
  21. while (!queue.IsEmpty())
  22. {
  23. Console.WriteLine(queue.DeQueue());
  24. }
  25.  
  26. queue.EnQueue();
  27. queue.EnQueue();
  28. queue.EnQueue();
  29. queue.EnQueue();
  30. queue.EnQueue();
  31. Console.WriteLine(queue.Size());
  32. while (!queue.IsEmpty())
  33. {
  34. Console.WriteLine(queue.DeQueue());
  35. }
  36. }
  37. }
  38. }

算法:基于 RingBuffer 的 Queue 实现《续》的更多相关文章

  1. 算法:基于 RingBuffer 的 Queue 实现

    背景 如果基于数组实现队列,常见的选择是采用 RingBuffer,否则就需要移动数组元素. RingBuffer 很容易看出 RingBuffer 的思想,这里就不赘述了. 您可以思考一个问题:图中 ...

  2. Google Cardboard的九轴融合算法——基于李群的扩展卡尔曼滤波

    Google Cardboard的九轴融合算法 --基于李群的扩展卡尔曼滤波 极品巧克力 前言 九轴融合算法是指通过融合IMU中的加速度计(三轴).陀螺仪(三轴).磁场计(三轴),来获取物体姿态的方法 ...

  3. [python] A*算法基于栅格地图的全局路径规划

    # 所有节点的g值并没有初始化为无穷大 # 当两个子节点的f值一样时,程序选择最先搜索到的一个作为父节点加入closed # 对相同数值的不同对待,导致不同版本的A*算法找到等长的不同路径 # 最后c ...

  4. 简单易学的机器学习算法—基于密度的聚类算法DBSCAN

    简单易学的机器学习算法-基于密度的聚类算法DBSCAN 一.基于密度的聚类算法的概述 我想了解下基于密度的聚类算法,熟悉下基于密度的聚类算法与基于距离的聚类算法,如K-Means算法之间的区别.    ...

  5. 简单易学的机器学习算法——基于密度的聚类算法DBSCAN

    一.基于密度的聚类算法的概述     最近在Science上的一篇基于密度的聚类算法<Clustering by fast search and find of density peaks> ...

  6. 算法:基于 RingBuffer 的 Deque 实现

    背景 前两篇文章介绍了 Queue 的实现,很多类库都引入了 Deque,Deque 可以两头添加和删除,然后在 Deque 之上构建 Queue 和 Stack. Deque 代码 using Sy ...

  7. 【笔记6】用pandas实现条目数据格式的推荐算法 (基于物品的协同)

    ''' 基于物品的协同推荐 矩阵数据 说明: 1.修正的余弦相似度是一种基于模型的协同过滤算法.我们前面提过,这种算法的优势之 一是扩展性好,对于大数据量而言,运算速度快.占用内存少. 2.用户的评价 ...

  8. 【笔记5】用pandas实现矩阵数据格式的推荐算法 (基于物品的协同)

    ''' 基于物品的协同推荐 矩阵数据 说明: 1.修正的余弦相似度是一种基于模型的协同过滤算法.我们前面提过,这种算法的优势之 一是扩展性好,对于大数据量而言,运算速度快.占用内存少. 2.用户的评价 ...

  9. 【笔记3】用pandas实现矩阵数据格式的推荐算法 (基于用户的协同)

    原书作者使用字典dict实现推荐算法,并且惊叹于18行代码实现了向量的余弦夹角公式. 我用pandas实现相同的公式只要3行. 特别说明:本篇笔记是针对矩阵数据,下篇笔记是针对条目数据. ''' 基于 ...

随机推荐

  1. CVE-2013-1347Microsoft Internet Explorer 8 远程执行代码漏洞

    [CNNVD]Microsoft Internet Explorer 8 远程执行代码漏洞(CNNVD-201305-092) Microsoft Internet Explorer是美国微软(Mic ...

  2. CCF CSP 201512-2 消除类游戏

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201512-2 消除类游戏 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行 ...

  3. CCF CSP 201412-4 最优灌溉

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201412-4 最优灌溉 问题描述 雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖 ...

  4. abtest分流随机链接方法(javascript)

    ¶¹¸¯¸ÉËêµÄ·¨¹úµçÊÓ¸²¸Ç --> 代码如下 <!DOCTYPE HTML> <html> <head> <script type=& ...

  5. slf4j logback pom

    pom: <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding&g ...

  6. 在LINUX环境下定时执行php脚本

    1. 使用Crontab定时执行linux环境下的php脚本文件 Cron,它是一个linux下的定时执行工具.根用户以外的用户可以使用 crontab 工具来配置 cron 任务.所有用户定义的 c ...

  7. Form与ModelForm-下拉框或者多选注意//及字段补充

    一.Form 设计一张普通model表: class UserInfo(models.Model): name = models.CharField(verbose_name='员工姓名', max_ ...

  8. Codeforces Round #448 C. Square Subsets

    题目链接 Codeforces Round #448 C. Square Subsets 题解 质因数 *质因数 = 平方数,问题转化成求异或方程组解的个数 求出答案就是\(2^{自由元-1}\) , ...

  9. PHP--SPL扩展学习笔记

    一. SPL是干嘛的 SPL是用于解决典型问题(standard problems)的一组接口与类的集合. 数据结构: .实现双向列表 SplDoublyLinkedList implements I ...

  10. UVALive 4869 Profits DP

    G - Profits Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status ...