zoukankan      html  css  js  c++  java
  • 循环队列 & 栈的共用空间

    循环队列

    非常好的数据结构,充分利用率空间,可以用于网络端存储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 = 4;
                //开堆
                m_data = new T[m_capacity];
                m_headIndex = 0;
                m_tailIndex = 0;
            }
    
            //带参构造
            public MyLoopQueue(int _capacity)
            {
                m_capacity = _capacity;
                //开堆
                m_data = new T[m_capacity];
                m_headIndex = 0;
                m_tailIndex = 0;
            }
    
            //检查是否容量达到上限
            public void Expansion()
            {
                if ((m_tailIndex + 1) % m_capacity == m_headIndex)
                {
                    //新建数据
                    int nCapacity = (int)(m_capacity * 1.5f);
                    T[] nData = new T[nCapacity];
    
                    //拷贝数据
                    for (int i = 0; i < Size; ++i)
                    {
                        nData[i] = m_data[(m_headIndex + i) % m_capacity];
                    }
    
                    //数据修改
                    m_headIndex = 0;
                    m_tailIndex = Capacity - 1;
                    m_capacity = nCapacity;
                    m_data = nData;
                }
            }
    
            //入队
            public void push(T _data)
            {
                Expansion();
                m_data[m_tailIndex] = _data;
                m_tailIndex = (m_tailIndex + 1) % m_capacity;
            }
    
            //出队
            public T Pop()
            {
                //安全校验
                if (m_tailIndex == m_headIndex)
                    return default(T);
    
                int r = m_headIndex;
                m_headIndex = (m_headIndex == m_capacity - 1) ? 0 : m_headIndex + 1;
                return m_data[r];
            }
    
            //遍历显示(C#控制台显示)
            public void Show(Action<T> _func)
            {
                //遍历 
                for (int i = 0; i < Size; ++i)
                {
                    //这个显示方式比
                    _func(m_data[(m_headIndex + i) % m_capacity]);
                }
            }
        }
    }
    View Code

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


     栈的共用空间

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

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

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

    整体思路如图:

  • 相关阅读:
    vue less使用/(除号/斜杠),浏览器不识别问题
    antDesignOfVue 表格复选框添加了默认选中状态,点击清空后数据清空,复选框的选中状态不变的问题。
    vue 可多选的日期插件
    antDesignOfVue 走马灯组件不自动定位到第一页
    antDesignOfVue 表格固定列之后出现空白列
    vue 动态添加表格列
    antDesignOfVue 符合条件的表格复选框禁止选中
    更换文件名大小写之后,git远程文件还存在,删除远程仓库的文件/文件夹
    git文件名大小写不敏感,更改文件大小写后无反应。
    记:mysql查询列含中文
  • 原文地址:https://www.cnblogs.com/jwv5/p/9066856.html
Copyright © 2011-2022 走看看