队列
    队列的概念是先进先出,这个应该不用多说了。看下面那个从网上找的现成图片。

循环队列
    循环队列在逻辑上将队列中的数据摆成环形,如下图:

下面直接上代码。

队列
队列的概念是先进先出,这个应该不用多说了。看下面那个从网上找的现成图片。 循环队列
循环队列在逻辑上将队列中的数据摆成环形,如下图: 下面直接上代码。 [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. 1、java数据结构和算法---循环队列

    直接上代码: public class CircleArrayQueueLvcai { private int[] array; private int maxSize;//循环队列大小 privat ...

  2. TypeScript算法与数据结构-队列和循环队列

    本文涉及的源码,均在我的github.有两部分队列和循环队列.有问题的可以提个issue,看到后第一时间回复 1. 队列(Queue) 队列也是一种线性的数据结构, 队列是一种先进先出的数据结构.类似 ...

  3. 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现

    一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...

  4. [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)

    循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). ...

  5. 数据结构:循环队列(C语言实现)

    生活中有非常多队列的影子,比方打饭排队,买火车票排队问题等,能够说与时间相关的问题,一般都会涉及到队列问题:从生活中,能够抽象出队列的概念,队列就是一个能够实现"先进先出"的存储结 ...

  6. JavaScript数据结构与算法(四) 循环队列的实现

    实现击鼓传花,需要用到上一章所述队列类Queue TypeScript方式实现源码 let hotPotato = (nameList, num) => { let queue = new Qu ...

  7. Javascript数据结构与算法--队列(顺序队列、优先队列、循环队列)的实现与用法

    前言 队列和栈非常类似,前面已经讲过了栈的实现与用法,现在我们来说说队列. 队列介绍 队列遵循FIFO(First In First Out,先进先出)原则的一组有序的项. 队列是一种特殊的线性表,特 ...

  8. <数据结构基础学习>(三)Part 2 队列

    一.队列 Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另一端(队首)取出元素. (排队) 队列是一种先进先出的数据结构(先到先得)FIFO ...

  9. C语言数据结构基础学习笔记——栈和队列

    之前我们学过了普通的线性表,接下来我们来了解一下两种特殊的线性表——栈和队列. 栈是只允许在一端进行插入或删除的线性表. 栈的顺序存储结构也叫作顺序栈,对于栈顶指针top,当栈为空栈时,top=-1: ...

随机推荐

  1. python语法小应用---列表和元组

    声明:本文章为参考总结CSDN上知识点所获,只是用来总结自己学习而用,如有侵权,会删除! 列表(list): 列表就像一个线性容器,但是比C++的 lis t扩展多得多 列表里的元素可以是相同类型,也 ...

  2. K最近邻kNN-学习笔记

    # -*- coding: utf-8 -*- """ Created on Thu Jan 24 09:34:32 2019 1. 翼尾花数据 2. 用 KNeighb ...

  3. Oracle 相关概念

    注:本文来源于 <腾科OCP培训课堂>.非准许商业活动. 标题:Oracle  相关概念 --->数据库名.实例名.数据库域名.全局数据名.服务名 一:数据库名 1:什么是数据库名 ...

  4. Linux mount 修改文件系统的读写属性

    有时候要在某个文件夹下添加和删除文件时,显示 "read only filesystem",说明该文件系统是只读的不能修改.使用 mount –o remount,rw / 命令可 ...

  5. Jmeter接口测试实例图文示例

    以getObjectByCode接口为例,用jmeter2.13来进行接口测试. 测试前准备: 测试工具及版本:jmeter 2.13 r1665067(须包含__MD5函数) 示例接口:8.1根据单 ...

  6. LeetCode(62):不同路径

    Medium! 题目描述: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“F ...

  7. RISC-V架构简介

    大道至简——RISC-V架构之魂(上)https://blog.csdn.net/zoomdy/article/details/79580529 大道至简——RISC-V架构之魂(中)https:// ...

  8. C#连接oracle连接字符串

    /// <summary> /// Oracle 的数据库连接字符串. /// </summary> private const String connString = @&q ...

  9. qrcodebox 面向移动设备的二维码弹出框

    qrcodebox 面向移动设备的二维码弹出框 qrcodebox 简介 qrcode box,一个小小的二维码工具,通过调用它,可以在页面中间弹出一个二维码窗口,主要是面向移动设备的,对于PC端浏览 ...

  10. BZOJ4972 八月月赛 Problem B 小Q的方格纸 二维前缀和

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4972 八月月赛Problem B 题目概括 一个矩阵,一坨询问,问矩阵中一个特定方向的等腰直角三角 ...