循环队列

非常好的数据结构,充分利用率空间,可以用于网络端存储socket消息!

/***************************************
作者: 未闻花语
版本: v1.0
最后修改时间: 2018/05/21
电话: 159****7727
功能&使用方法:
* 泛型循环队列
* 1.计算使用大小 和 空间是否满的方法很是巧妙可以多加留意
* 2.我使用的循环队列和传统(即汇众老曾的循环队列表不同),
* 具体请见《大话数据结构》,永远都会有至少一个空间,目的是
* 为了方便计算空间大小
*
* 优点:
* 1.节约空间 一次扩容为原队列1.5倍 内存交互不平凡
* 缺点:
* 2.切记这种方式实际使用量比容量少1个
*
* 适用:
* 适用于Socket通信中的消息存储
*
* 存在方法:
* <0> ----------- MyLoopQueue<T>() -------- 无参构造 & 带参构造
* <1> ----------- Expansion()私有 --------- 扩容
* <2> ----------- Push(T _data) ----------- 入队
* <3> ----------- Pop() ------------------- 出队
* <4> ----------- Show(Action<T>) --------- 显示
* 存在属性:
***************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace MyQueue
{
class MyLoopQueue<T>
{
//头指针
private int m_headIndex;
//尾指针
private int m_tailIndex;
//数据
private T[] m_data; //当前容量
private int m_capacity;
public int Capacity { get { return m_capacity; } }
//当前使用大小
public int Size { get {
return (m_tailIndex - m_headIndex + m_capacity) % m_capacity;
} } //无参构造
public MyLoopQueue()
{
//默认大小为4
m_capacity = ;
//开堆
m_data = new T[m_capacity];
m_headIndex = ;
m_tailIndex = ;
} //带参构造
public MyLoopQueue(int _capacity)
{
m_capacity = _capacity;
//开堆
m_data = new T[m_capacity];
m_headIndex = ;
m_tailIndex = ;
} //检查是否容量达到上限
public void Expansion()
{
if ((m_tailIndex + ) % m_capacity == m_headIndex)
{
//新建数据
int nCapacity = (int)(m_capacity * 1.5f);
T[] nData = new T[nCapacity]; //拷贝数据
for (int i = ; i < Size; ++i)
{
nData[i] = m_data[(m_headIndex + i) % m_capacity];
} //数据修改
m_headIndex = ;
m_tailIndex = Capacity - ;
m_capacity = nCapacity;
m_data = nData;
}
} //入队
public void push(T _data)
{
Expansion();
m_data[m_tailIndex] = _data;
m_tailIndex = (m_tailIndex + ) % m_capacity;
} //出队
public T Pop()
{
//安全校验
if (m_tailIndex == m_headIndex)
return default(T); int r = m_headIndex;
m_headIndex = (m_headIndex == m_capacity - ) ? : m_headIndex + ;
return m_data[r];
} //遍历显示(C#控制台显示)
public void Show(Action<T> _func)
{
//遍历
for (int i = ; i < Size; ++i)
{
//这个显示方式比
_func(m_data[(m_headIndex + i) % m_capacity]);
}
}
}
}

附带上 入口点函数测试部分(这部分代码遗失了!> - > !)


栈的共用空间

关键思路是,两栈的起始位置在数组的两端,方向是向数组的中间靠拢。

1.在两栈的数据相互制衡(即一个增加,另一个必定减少,且知道其最大值的情况下尤其好用)

2.避免了那种空间上的浪费

整体思路如图:

循环队列 & 栈的共用空间的更多相关文章

  1. c/c++线性循环队列

    线性循环队列 队列是先进先出,和栈相反. 线性循环队列,牺牲一个空间,实现循环.比如空间大小为4,牺牲一个空间,所以最多放3个元素. 假设front指向0位置,tail指向3位置 1 2 3 空 出队 ...

  2. javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例

    1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...

  3. 数据结构(C语言版)---第三章栈和队列 3.4.2 队列的链式表示和实现(循环队列)

    这个是循环队列的实现,至于串及数组这两章,等有空再看,下面将学习树. 源码如下: #include <stdio.h> #include <stdlib.h> #define ...

  4. Java数据类型Stack栈、Queue队列、数组队列和循环队列的比较

    判断括号是否匹配:调用java本身 import java.util.Stack; public class Solution { public boolean isValid(String s){ ...

  5. 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列

    一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...

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

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

  7. Java实现一个简单的循环队列

    在某些时候,我们不能被要求像数组一样可以使用索引随机访问,而是需要被限制顺序处理业务,今天介绍一种先进先出(FIFO)的线性数据结构:队列, 当然,还有后进先出(LIFO)的处理方式,即为栈(后续有时 ...

  8. 队列的理解和实现(一) ----- 循环队列(java实现)

    什么是队列 我们都知道栈是先进后出的一种线性表,与之相反的是,队列是一种先进先出的线性表.它只允许在表的一端进行插入,而在另一端进行删除.举个例子来说,在生活中我们买东西需要进行排队,最先排队的可以最 ...

  9. 数据结构----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列

    一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...

随机推荐

  1. js跨域传值,兼容ie8以上

    js跨域传值,兼容ie8以上 事先说明,此方法并不支持ie8,如果想要支持ie8的话,需要用这种思路(来自微软): if (window.addEventListener) { window.addE ...

  2. list按照某个元素进行排序

    import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u ...

  3. Selenium IDE录制脚本时弹出窗口的完美处理

    很多朋友录制脚本时新打开弹出窗口后无法定位元素,我也遇到同样的问题,国内没有什么好的资料,于是就阅读英文,不断尝试,感觉那个selectWindow(title)什么就是个坑,我用这种方法成功处理后得 ...

  4. Spring.Net配置

    <?xml version="1.0" encoding="utf-8"?> <configuration>     <!--一定 ...

  5. Python:Fintech产品的第一语言

    来源商业新知,原标题:为什么说Python是Fintech与金融变革的秘密武器 人生苦短,不止程序员,Python正在吸引来自金融领域大佬们的青睐目光. 金融科技的风口下,无数传统金融人都想从中掘一桶 ...

  6. 云笔记项目-Spring事务学习_测试准备

    在做云笔记项目的过程中,顺便简单的学习了Spring的事务概念,业务以如果添加笔记,则增加用户星星数目作为例子,引入了事务的概念.类似注册送积分之类的,云笔记项目以增加笔记就送星星来说明事务.具体在添 ...

  7. mysql查询语句中自定义变量(转)

    转:http://blog.sina.com.cn/s/blog_1512521570102wrfl.htmlselect cost,@a:=@a+1 from testone,(select @a: ...

  8. 安装Python-Jenkins

    有两种方式安装: ①有网络:sudo pip install python-jenkins ②无网络: 下载文件:https://pypi.org/project/python-jenkins/#fi ...

  9. 小强学渲染之OpenGL的CPU管线

    读到这里,应该对OpenGL渲染管线有了初步简单了解.下面着重分析CPU管线,即逻辑控制中心做了什么,这部分还是容易理解的.如下图: 一,将数据加载到显存中. 这是由GPU是访问显存中的数据决定的.因 ...

  10. 100-days: fifteen

    Title: Disney(迪士尼) moves from behemoth to colossus with closing(使…结束,使停止) of Fox(福克斯) deal(商业上的交易/协议 ...