循环队列

非常好的数据结构,充分利用率空间,可以用于网络端存储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. flex兼容性之Webpack3+postcss+sass+css

    1:⚠️⚠️ 首先安装依赖 npm install --save-dev webpack style-loader css-loader postcss-loader sass-loader auto ...

  2. RestExpress response中addHeader 导致stackOverflow

    问题描述: 最近在项目使用中要在restExpress的header中增加一个键值对,同事在使用的时候没有对header的value进行非空判断,于是在测试环境测试的时候就出现了一个异常

  3. leetcode94

    class Solution { public: vector<int> V; void inOrder(TreeNode* node) { if (node != NULL) { if ...

  4. JRebel 代理激活

    1.生成GUID   https://www.guidgen.com/ 例:04cfff79-8f45-481c-a858-a5b9590422e7 2.License Server 例: http: ...

  5. spring @transactional 注解事务

    1.在spring配置文件中引入<tx:>命名空间 <beans xmlns="http://www.springframework.org/schema/beans&qu ...

  6. Node.js 初识2

    原文:https://www.cnblogs.com/zzuIvy/p/nodejs_1.html 测试:node.js部署网站 1.创建js2.js var http = require('http ...

  7. 最新ceph集群常用命令梳理

    结合网络.官网.手动查询等多方渠道,整理ceph维护管理常用命令,并且梳理常规命令在使用过程中的逻辑顺序.另外整理期间发现ceph 集群的命令体系有点乱,详细情况各自体验. 一:ceph集群启动.重启 ...

  8. xadmin设置

    1.xadmin配置 INSTALLED_APPS = ( ... 'xadmin' , 'crispy_forms' , 'reversion' , ... ) 2.注册类 import xadmi ...

  9. Mysql添加新用户遇到的一些小问题

    登陆命令:mysql -u root -p 添加本地用户:create user  'sheet'@'localhost' identified by '123456' ; 添加允许外网IP访问的用户 ...

  10. DJango 基础 (1)

    django基础 知识点: 基本认知 工具准备 新建项目 目录及文件说明 开发服务器 创建视图函数 新建应用(app) 1.基本认知 Django是用Python开发的一个免费开源的Web框架,可以用 ...