算法:基于 RingBuffer 的 Queue 实现《续》
背景
上篇实现了一个简单的队列,内部使用了 _count 计数,本文采用另外一种模式,不用 _count 计数。
RingBuffer
不用 _count 计数的话,为了区分队列的满和空,需要在数组中预留一格,如下图就代表了一个满队列。
ArrayQueue
代码
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace DataStuctureStudy.Queues
- {
- public class ArrayQueue2<T>
- {
- private readonly int _maxSize;
- private readonly T[] _items;
- private int _header = ;
- private int _tail = -;
- public ArrayQueue2(int size)
- {
- _maxSize = size + ;
- _items = new T[_maxSize];
- }
- public void EnQueue(T item)
- {
- if (this.IsFull())
- {
- throw new InvalidOperationException("队列已满");
- }
- if (_tail == _maxSize - )
- {
- _tail = -;
- }
- _items[++_tail] = item;
- }
- public T DeQueue()
- {
- if (this.IsEmpty())
- {
- throw new InvalidOperationException("队列已空");
- }
- T item = _items[_header++];
- if (_header == _maxSize)
- {
- _header = ;
- }
- return item;
- }
- public T Peek()
- {
- if (this.IsEmpty())
- {
- throw new InvalidOperationException("队列已空");
- }
- return _items[_header];
- }
- public bool IsFull()
- {
- return
- (_header + _maxSize - == _tail)
- ||
- (_tail + == _header);
- }
- public bool IsEmpty()
- {
- return
- (_tail + == _header)
- ||
- (_header == && _tail == _maxSize - );
- }
- public int Size()
- {
- if (_tail >= _header)
- {
- return _tail - _header + ;
- }
- else
- {
- return (_maxSize - _header) + (_tail + );
- }
- }
- }
- }
测试
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace DataStuctureStudy
- {
- class Program
- {
- static void Main(string[] args)
- {
- var queue = new Queues.ArrayQueue2<int>();
- queue.EnQueue();
- queue.EnQueue();
- queue.EnQueue();
- queue.EnQueue();
- queue.EnQueue();
- Console.WriteLine(queue.Size());
- while (!queue.IsEmpty())
- {
- Console.WriteLine(queue.DeQueue());
- }
- queue.EnQueue();
- queue.EnQueue();
- queue.EnQueue();
- queue.EnQueue();
- queue.EnQueue();
- Console.WriteLine(queue.Size());
- while (!queue.IsEmpty())
- {
- Console.WriteLine(queue.DeQueue());
- }
- }
- }
- }
算法:基于 RingBuffer 的 Queue 实现《续》的更多相关文章
- 算法:基于 RingBuffer 的 Queue 实现
背景 如果基于数组实现队列,常见的选择是采用 RingBuffer,否则就需要移动数组元素. RingBuffer 很容易看出 RingBuffer 的思想,这里就不赘述了. 您可以思考一个问题:图中 ...
- Google Cardboard的九轴融合算法——基于李群的扩展卡尔曼滤波
Google Cardboard的九轴融合算法 --基于李群的扩展卡尔曼滤波 极品巧克力 前言 九轴融合算法是指通过融合IMU中的加速度计(三轴).陀螺仪(三轴).磁场计(三轴),来获取物体姿态的方法 ...
- [python] A*算法基于栅格地图的全局路径规划
# 所有节点的g值并没有初始化为无穷大 # 当两个子节点的f值一样时,程序选择最先搜索到的一个作为父节点加入closed # 对相同数值的不同对待,导致不同版本的A*算法找到等长的不同路径 # 最后c ...
- 简单易学的机器学习算法—基于密度的聚类算法DBSCAN
简单易学的机器学习算法-基于密度的聚类算法DBSCAN 一.基于密度的聚类算法的概述 我想了解下基于密度的聚类算法,熟悉下基于密度的聚类算法与基于距离的聚类算法,如K-Means算法之间的区别. ...
- 简单易学的机器学习算法——基于密度的聚类算法DBSCAN
一.基于密度的聚类算法的概述 最近在Science上的一篇基于密度的聚类算法<Clustering by fast search and find of density peaks> ...
- 算法:基于 RingBuffer 的 Deque 实现
背景 前两篇文章介绍了 Queue 的实现,很多类库都引入了 Deque,Deque 可以两头添加和删除,然后在 Deque 之上构建 Queue 和 Stack. Deque 代码 using Sy ...
- 【笔记6】用pandas实现条目数据格式的推荐算法 (基于物品的协同)
''' 基于物品的协同推荐 矩阵数据 说明: 1.修正的余弦相似度是一种基于模型的协同过滤算法.我们前面提过,这种算法的优势之 一是扩展性好,对于大数据量而言,运算速度快.占用内存少. 2.用户的评价 ...
- 【笔记5】用pandas实现矩阵数据格式的推荐算法 (基于物品的协同)
''' 基于物品的协同推荐 矩阵数据 说明: 1.修正的余弦相似度是一种基于模型的协同过滤算法.我们前面提过,这种算法的优势之 一是扩展性好,对于大数据量而言,运算速度快.占用内存少. 2.用户的评价 ...
- 【笔记3】用pandas实现矩阵数据格式的推荐算法 (基于用户的协同)
原书作者使用字典dict实现推荐算法,并且惊叹于18行代码实现了向量的余弦夹角公式. 我用pandas实现相同的公式只要3行. 特别说明:本篇笔记是针对矩阵数据,下篇笔记是针对条目数据. ''' 基于 ...
随机推荐
- CVE-2013-1347Microsoft Internet Explorer 8 远程执行代码漏洞
[CNNVD]Microsoft Internet Explorer 8 远程执行代码漏洞(CNNVD-201305-092) Microsoft Internet Explorer是美国微软(Mic ...
- CCF CSP 201512-2 消除类游戏
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201512-2 消除类游戏 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行 ...
- CCF CSP 201412-4 最优灌溉
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201412-4 最优灌溉 问题描述 雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖 ...
- abtest分流随机链接方法(javascript)
¶¹¸¯¸ÉËêµÄ·¨¹úµçÊÓ¸²¸Ç --> 代码如下 <!DOCTYPE HTML> <html> <head> <script type=& ...
- slf4j logback pom
pom: <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding&g ...
- 在LINUX环境下定时执行php脚本
1. 使用Crontab定时执行linux环境下的php脚本文件 Cron,它是一个linux下的定时执行工具.根用户以外的用户可以使用 crontab 工具来配置 cron 任务.所有用户定义的 c ...
- Form与ModelForm-下拉框或者多选注意//及字段补充
一.Form 设计一张普通model表: class UserInfo(models.Model): name = models.CharField(verbose_name='员工姓名', max_ ...
- Codeforces Round #448 C. Square Subsets
题目链接 Codeforces Round #448 C. Square Subsets 题解 质因数 *质因数 = 平方数,问题转化成求异或方程组解的个数 求出答案就是\(2^{自由元-1}\) , ...
- PHP--SPL扩展学习笔记
一. SPL是干嘛的 SPL是用于解决典型问题(standard problems)的一组接口与类的集合. 数据结构: .实现双向列表 SplDoublyLinkedList implements I ...
- UVALive 4869 Profits DP
G - Profits Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status ...