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: ...
随机推荐
- App调试的几个命令实践【转】
在Android的应用开发中,我们会用到各种代码调试:其实在Android的开发之后,我们可能会碰到一些随机的问题,如cpu过高,内存泄露等,我们无法简单的进行代码调试,我们需要一个系统日志等等,下面 ...
- 转:10分钟了解JS堆、栈以及事件循环的概念
https://juejin.im/post/5b1deac06fb9a01e643e2a95?utm_medium=fe&utm_source=weixinqun 前言 其实一开始对栈.堆的 ...
- WAP网页中点击链接直接拨打电话的方法
主要方法有两种: 第一种: 这种也是最简单的. 示例代码: <a href="tel:+18790853577">点击拨打</a> 第二种: <a h ...
- LeetCode(1):两数之和
写在前面:基本全部参考大神“Grandyang”的博客,附上网址:http://www.cnblogs.com/grandyang/p/4130379.html 写在这里,是为了做笔记,同时加深理解, ...
- java 扫描输入
到目前为止,从文件或标准输入读取数据还是一件相当痛苦第事情,一般第解决之道就是读入一行文本,对其进行分词,然后使用Integer Double 等类第各种解析方法来解析数据: //: strings/ ...
- 算法-----python实现
斐波那契数列 def f(n): if n == 1: return 1 elif n == 2: return 1 else: return f(n-1)+f(n-2) print(f(8)) 用普 ...
- list的遍历
package list; import java.util.ArrayList;import java.util.Iterator;import java.util.List; /* * list的 ...
- 用函数打印Hello js
<script> function sayHello() { document.write("Hello js!"); } sayHello(); </scrip ...
- Promise in Chakra
http://www.ecma-international.org/ecma-262/#sec-fulfillpromise 25.4.1.3.1 and 25.4.1.3.2 Promise Rej ...
- 【C++ Primer 第16章】2. 模板实参推断
模板实参推断:对于函数模板,编译器利用调用中的函数实参来确定模板参数,从函数实参来确定模板参数的过程被称为模板实参推断. 类型转换与模板类型参数 与往常一样,顶层const无论在形参中还是在是实参中, ...