循环队列 & 栈的共用空间
循环队列
非常好的数据结构,充分利用率空间,可以用于网络端存储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.避免了那种空间上的浪费
整体思路如图:

循环队列 & 栈的共用空间的更多相关文章
- c/c++线性循环队列
线性循环队列 队列是先进先出,和栈相反. 线性循环队列,牺牲一个空间,实现循环.比如空间大小为4,牺牲一个空间,所以最多放3个元素. 假设front指向0位置,tail指向3位置 1 2 3 空 出队 ...
- javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例
1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...
- 数据结构(C语言版)---第三章栈和队列 3.4.2 队列的链式表示和实现(循环队列)
这个是循环队列的实现,至于串及数组这两章,等有空再看,下面将学习树. 源码如下: #include <stdio.h> #include <stdlib.h> #define ...
- Java数据类型Stack栈、Queue队列、数组队列和循环队列的比较
判断括号是否匹配:调用java本身 import java.util.Stack; public class Solution { public boolean isValid(String s){ ...
- 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...
- [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)
循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). ...
- Java实现一个简单的循环队列
在某些时候,我们不能被要求像数组一样可以使用索引随机访问,而是需要被限制顺序处理业务,今天介绍一种先进先出(FIFO)的线性数据结构:队列, 当然,还有后进先出(LIFO)的处理方式,即为栈(后续有时 ...
- 队列的理解和实现(一) ----- 循环队列(java实现)
什么是队列 我们都知道栈是先进后出的一种线性表,与之相反的是,队列是一种先进先出的线性表.它只允许在表的一端进行插入,而在另一端进行删除.举个例子来说,在生活中我们买东西需要进行排队,最先排队的可以最 ...
- 数据结构----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...
随机推荐
- android 开发 View _15 导入一张图片将它裁剪成圆形 与 paint图层叠加处理详解
方法一: /* 实现思维是这样的: 1.首先拿到bitmap图片 2.得到bitmap图片的高度 宽度,并且计算好各个画图尺寸 3.创建一个空白的 bitmap图片: Bitmap output = ...
- RestExpress response中addHeader 导致stackOverflow
问题描述: 最近在项目使用中要在restExpress的header中增加一个键值对,同事在使用的时候没有对header的value进行非空判断,于是在测试环境测试的时候就出现了一个异常
- import_module 导入变量的包
遇到你想导入的包是变量的时候,可以用这个实现 from importlib import import_module settings_path = self.pathm2 = import_modu ...
- DOM 节点node
DOM可以将任何HTML或XML文档描绘成一个有多层节点构成的结构,即在HTML中所有内容都是节点.文档节点是每个文档的根节点,文档节点有一个子节点,称为文档元素.每个文档只能有一个文档元素.在HTM ...
- Python设计模式 - UML - 包图(Package Diagram)
简介 包图是对各个包及包之间关系的描述,展现系统中模块与模块之间的依赖关系.一个包图可以由任何一种UML图组成,可容纳的元素有类.接口.组件.用例和其他包等.包是UML中非常常用的元素,主要作用是分类 ...
- 中间件RabbitMQ之运维篇
一.RabbtMQ简介 RabbitMQ的官方站: http:/://www.rabbitmq.com/ rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业 ...
- Django 表关系
1.自定义主键字段的创建 AutoFiled(pirmary_key=True) # 一般不会自定义2.order_by asc desc 1. 表关系的创建- OneToOne student = ...
- uvm_pre_do
https://blog.csdn.net/tingtang13/article/details/46535649 1.uvm_do 封装了一系列接口,封装越多,灵活性越差.所以增加了三个接口:pre ...
- vue绑定html的class属性的方法
一.对象语法绑定class属性 class的属性代码如下 <style type="text/css"> .red{ color: red; width: 100px; ...
- mencached
是一个免费开源的,分布式内存对象缓存系统数据库. 是一个非关系型数据库形式,属于NOSQL NOT OLNY SQL ,不仅仅是关系数据库 它属于K V 存储 KEY VALUE 相对应的存储 KEY ...