循环队列 & 栈的共用空间
循环队列
非常好的数据结构,充分利用率空间,可以用于网络端存储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)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...
随机推荐
- how find out what is causing Visual Studio to think each project is out of date
You can find out what is causing Visual Studio to think each project is out of date, and then addres ...
- svg旋转动画
<!doctype html><html><head> <title>test</title> <meta charset=" ...
- JAVA类与类之间的全部关系简述+代码详解
本文转自: https://blog.csdn.net/wq6ylg08/article/details/81092056类和类之间关系包括了 is a,has a, use a三种关系(1)is a ...
- Log4J2用法
一. 关于Log4J 2015年5月,Apache宣布Log4J 1.x 停止更新.最新版为1.2.17. 如今,Log4J 2.x已更新至2.7. 官方网址:http://logging.ap ...
- jenkins+sonarQube代码质量扫描 并排除指定的目录
sonar.projectKey=dev1-news-paymentsonar.projectName=dev1-news-paymentsonar.projectVersion=$BUILD_NUM ...
- C++内存空间
- 20175314 《Java程序设计》第二周学习总结
20175314 <Java程序设计>第二周学习总结 教材学习内容总结 我在APPstore上发现了一个可以支持我们在IOS系统上学习实践Java程序的开发环境,只需要购买专业版就可以使用 ...
- project1
知识漏洞 有空就默写一下-.- [概念] 要好好理解并且背下来记住 MVC要分开,Servlet里面不处理计算的逻辑,只有调用函数(是不是变量传进来以后,调用都不能有呢?) clear map不能直 ...
- Shell 数值、字符串比较
Shell脚本中,数值与字符串比较是不同的,因此要注意(注意[]括号内参数和括号之间有一个空格). 一.数值比较 -eq 等于,如: if [ $a -eq $b ] -ne 不等于,如: if ...
- python问题:AttributeError: 'module' object has no attribute 'SSL_ST_INIT'(转)
原文地址:http://www.cnblogs.com/zhaijiahui/p/7344778.html AttributeError: 'module' object has no attribu ...