C# 数据结构基础-实现循环队列
队列
队列的概念是先进先出,这个应该不用多说了。看下面那个从网上找的现成图片。
循环队列
循环队列在逻辑上将队列中的数据摆成环形,如下图:
下面直接上代码。
队列
队列的概念是先进先出,这个应该不用多说了。看下面那个从网上找的现成图片。 循环队列
循环队列在逻辑上将队列中的数据摆成环形,如下图: 下面直接上代码。 [csharp] view plain copy 在CODE上查看代码片派生到我的代码片
/// <summary>
/// 循环队列
/// 2015年1月4日
/// </summary>
/// <typeparam name="T"></typeparam>
public class MyCircleQueue<T>
{
/// <summary>
/// 队列数组
/// </summary>
private T[] _queue;
/// <summary>
/// 队首索引
/// </summary>
private int _front;
/// <summary>
/// 队尾索引
/// </summary>
private int _rear; /// <summary>
/// 队列的内存大小,但实际可用大小为_capacity-1
/// </summary>
private int _capacity; public MyCircleQueue(int queueSize)
{
if (queueSize < 1)
throw new IndexOutOfRangeException("传入的队列长度不能小于1。"); //设置队列容量
_capacity = queueSize; //创建队列数组
_queue = new T[queueSize]; //初始化队首和队尾索引
_front = _rear = 0;
} /// <summary>
/// 添加一个元素
/// </summary>
/// <param name="item"></param>
public void Push(T item)
{
//队列已满
if (GetNextRearIndex() == _front)
{
//扩大数组
T[] newQueue = new T[2 * _capacity]; if (newQueue == null)
throw new ArgumentOutOfRangeException("数据容量过大,超出系统内存大小。");
//队列索引尚未回绕
if (_front == 0)
{
//将旧队列数组数据转移到新队列数组中
Array.Copy(_queue, newQueue, _capacity);
}
else
{
//如果队列回绕,刚需拷贝再次,
//第一次将队首至旧队列数组最大长度的数据拷贝到新队列数组中
Array.Copy(_queue, _front, newQueue, _front, _capacity - _rear - 1);
//第二次将旧队列数组起始位置至队尾的数据拷贝到新队列数组中
Array.Copy(_queue, 0, newQueue, _capacity, _rear + 1);
//将队尾索引改为新队列数组的索引
_rear = _capacity + 1;
} _queue = newQueue;
_capacity *= 2;
} //累加队尾索引,并添加当前项
_rear = GetNextRearIndex();
_queue[_rear] = item;
} /// <summary>
/// 获取队首元素
/// </summary>
/// <returns></returns>
public T FrontItem()
{
if (IsEmpty())
throw new ArgumentOutOfRangeException("队列为空。"); return _queue[GetNextFrontIndex()];
} /// <summary>
/// 获取队尾元素
/// </summary>
/// <returns></returns>
public T RearItem()
{
if (IsEmpty())
throw new ArgumentOutOfRangeException("队列为空。"); return _queue[_rear];
} /// <summary>
/// 弹出一个元素
/// </summary>
/// <returns></returns>
public T Pop()
{
if (IsEmpty())
throw new ArgumentOutOfRangeException("队列为空。"); _front = GetNextFrontIndex();
return _queue[_front];
} /// <summary>
/// 队列是否为空
/// </summary>
/// <returns></returns>
public bool IsEmpty()
{
return _front == _rear;
}
/// <summary>
/// 获取下一个索引
/// </summary>
/// <returns></returns>
private int GetNextRearIndex()
{
if (_rear + 1 == _capacity)
{
return 0;
}
return _rear + 1;
} /// <summary>
/// 获取下一个索引
/// </summary>
/// <returns></returns>
private int GetNextFrontIndex()
{
if (_front + 1 == _capacity)
{
return 0;
}
return _front + 1;
}
}
转自:http://blog.csdn.net/liguo9860/article/details/42395009
C# 数据结构基础-实现循环队列的更多相关文章
- 1、java数据结构和算法---循环队列
直接上代码: public class CircleArrayQueueLvcai { private int[] array; private int maxSize;//循环队列大小 privat ...
- TypeScript算法与数据结构-队列和循环队列
本文涉及的源码,均在我的github.有两部分队列和循环队列.有问题的可以提个issue,看到后第一时间回复 1. 队列(Queue) 队列也是一种线性的数据结构, 队列是一种先进先出的数据结构.类似 ...
- 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现
一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...
- [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)
循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). ...
- 数据结构:循环队列(C语言实现)
生活中有非常多队列的影子,比方打饭排队,买火车票排队问题等,能够说与时间相关的问题,一般都会涉及到队列问题:从生活中,能够抽象出队列的概念,队列就是一个能够实现"先进先出"的存储结 ...
- JavaScript数据结构与算法(四) 循环队列的实现
实现击鼓传花,需要用到上一章所述队列类Queue TypeScript方式实现源码 let hotPotato = (nameList, num) => { let queue = new Qu ...
- Javascript数据结构与算法--队列(顺序队列、优先队列、循环队列)的实现与用法
前言 队列和栈非常类似,前面已经讲过了栈的实现与用法,现在我们来说说队列. 队列介绍 队列遵循FIFO(First In First Out,先进先出)原则的一组有序的项. 队列是一种特殊的线性表,特 ...
- <数据结构基础学习>(三)Part 2 队列
一.队列 Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另一端(队首)取出元素. (排队) 队列是一种先进先出的数据结构(先到先得)FIFO ...
- C语言数据结构基础学习笔记——栈和队列
之前我们学过了普通的线性表,接下来我们来了解一下两种特殊的线性表——栈和队列. 栈是只允许在一端进行插入或删除的线性表. 栈的顺序存储结构也叫作顺序栈,对于栈顶指针top,当栈为空栈时,top=-1: ...
随机推荐
- 前端实现商品sku属性选择
一.效果图 二.后台返回的数据格式 [{ "saleName": "颜色", "dim": 1, "saleAttrList&qu ...
- vue系列之flex经典案例
案例分析: 1.中间文字居中 2.文字俩边有横线 横线无法固定宽度,因为在大屏手机上,容易出现Bug,宽度不够,俩边会出现大量空隙 解决办法,使用flex布局(网站链接) 代码: <div cl ...
- 篮球弹起问题(for循环)
- 如何理解深度学习中的Transposed Convolution?
知乎上的讨论:https://www.zhihu.com/question/43609045?sort=created 不过看的云里雾里,越看越糊涂. 直到看到了这个:http://deeplearn ...
- java 标签编译后没有显示
1.原因现在还不知,试了几个地方可以和不可以 /** * @author feilong */ public class OverLoading { /**@param args put here c ...
- 多行文字溢出[...]的实现(text-overflow: ellipsis)
声明:此文章为转载(点击查看原文),如有侵权24小时内删除.联系QQ:1522025433. 对于单行文字, 很简单.(详见css3产考手册 进入) css: .oneLine { width: 20 ...
- Android SDK安装及配置模拟器
环境搭建 1.安装JDK 2.下载Android sdk exe格式和zip格式都可以 3.安装installer_r24.4.1-windows.exe文件,里面有两个应用程序: "SDK ...
- centos下配置DNS
centos网络配置实例 1,配置DNSvi /etc/resolv.conf加入: 代码如下: nameserver 192.168.0.1 nameserver 8.8.8.8 nameserve ...
- 浅谈Phoenix在HBase中的应用
一.前言 业务使用HBase已经有一段时间了,期间也反馈了很多问题,其中反馈最多的是HBase是否支持SQL查询和二级索引,由于HBase在这两块上目前暂不支持,导致业务在使用时无法更好的利用现有的经 ...
- ThreadLocal详解,处理成员变量线程不安全的情况
ThreadLocal翻译成中文比较准确的叫法应该是:线程局部变量. 这个玩意有什么用处,或者说为什么要有这么一个东东?先解释一下,在并发编程的时候,成员变量如果不做任何处理其实是线程不安全的,各个线 ...