循环队列

非常好的数据结构,充分利用率空间,可以用于网络端存储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. Oracle SQL 优化规则

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...

  2. IDEA VM设置

    1.IDEA vm options -server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128 ...

  3. orcal安装

    1.下载安装包(版本32位或64位)下载网址:https://www.oracle.com,建议关闭防火墙(可以的话关闭网) 2.将两个安装包解压为一个安装包 3.点击执行 3. 4. 5. 5. 6 ...

  4. mysql 乐观锁实现

    一.为什么需要锁(并发控制)?      在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突.这就是著名的并发性问题.      典型的冲突有:        1.丢失更新:一个事 ...

  5. mybatis泛型(一)

    mybatis的确很方便,可以随意配置sql语句,并根据参数生成指定的sql,也可以根据查询结果生成指定对象 但是有一点非常恐怖,就是每个数据库表都必须有一个配置,等于在一个系统里做了很多重复的工作, ...

  6. python open函数的坑

    python的open函数用来打开文件,但是在打开windows下文件时候会出错 f = open("e:\python_learn\test.txt", "r" ...

  7. ArcPy开发教程1-面向ArcGIS的Python语言基础

    ArcPy开发教程1-面向ArcGIS的Python语言基础 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 第一节课 时间2019年2月26日 上午第一节 讲解:A ...

  8. django内置分页功能扩展

    实现自定制页码数类型class myPaginator(Paginator): def __init__(self,curr_page,per_page_num,*args,**kwargs): se ...

  9. Python设计模式 - 基础 - 封装 & 继承 & 多态

    面向对象的核心是对象,世间万物都可以看作对象,任何一个对象都可以通过一系列属性和行为来描述,可以包含任意数量和类型的数据或操作.类是用来描述具有相同属性和方法的所有对象的集合.类通常是抽象化的概念,而 ...

  10. 算法练习LeetCode初级算法之树

    二叉树的前序遍历 我的解法:利用递归,自底向下逐步添加到list,返回最终的前序遍历list class Solution { public List<Integer> preorderT ...