zoukankan      html  css  js  c++  java
  • 环形队列CQueue类模板示例

     1 #pragma once
     2 // C++环形队列类模板
     3 typedef unsigned int uint32_t; // 使用可移植数据类型
     4 template<typename DATA>
     5 class CQueue
     6 {
     7     DATA *m_pData;
     8     uint32_t m_nHead, m_nTail;
     9     uint32_t m_nCount, m_nSize;
    10 public:
    11 
    12     inline bool isFull()
    13     {// 两种情况:①头在尾前面;②尾在头前面
    14         //return (m_nTail + 1 - m_nHead == m_nCount) || (m_nTail + 1 == m_nHead); // 满栈1,非满0
    15         return (m_nTail + 1) % m_nCount == m_nHead;
    16     }
    17     inline bool isEmpty()
    18     {
    19         return m_nHead == m_nTail; // 空栈1,非空0
    20     }
    21     inline int size() const
    22     {
    23         return m_nSize;
    24     }
    25     inline DATA &front() const
    26     {
    27         return m_pData[m_nHead];
    28     }
    29     inline DATA &back() const
    30     {
    31         return m_pData[m_nTail-1];
    32     }
    33     CQueue(const uint32_t nCount = 5); // 有参构造
    34     ~CQueue(); // 析构函数
    35     bool push(const DATA & d); // 入列
    36     bool pop(DATA & d); // 出列
    37 
    38 };
    39 
    40 template<typename DATA>
    41 CQueue<DATA>::CQueue(const uint32_t nCount)
    42 {
    43     m_pData = new DATA[nCount]; // 指向队列的堆空间
    44     //m_pData[nCount-1] = -1; // 初始化队列定位符位置为0xffffffff,便于查看,默认为0xcdcdcdcd
    45     m_nHead = m_nTail = 0; // 头和尾指向首元素下标
    46     m_nCount = nCount; // 记录队列长度
    47     m_nSize = 0; // 记录队列中元素个数
    48 }
    49 
    50 template<typename DATA>
    51 CQueue<DATA>::~CQueue()
    52 {
    53     m_nHead = m_nTail = 0;
    54     m_nCount = 0;
    55     m_nSize = 0;
    56     delete[]m_pData;
    57 }
    58 
    59 template<typename DATA>
    60 bool CQueue<DATA>::push(const DATA &d)
    61 {
    62     if (isFull())
    63         return false;
    64     ++m_nSize;
    65     //if (m_nTail == m_nCount) // 入列之前判断是否到了队尾
    66     //    m_nTail = 0;
    67     m_nTail = m_nTail % m_nCount;
    68     m_pData[m_nTail++] = d;
    69     return true;
    70 }
    71 
    72 template<typename DATA>
    73 bool CQueue<DATA>::pop(DATA &d)
    74 {
    75     if (isEmpty())
    76         return false;
    77     --m_nSize;
    78     //if (m_nHead == m_nCount) // 出列判断是否到了队尾
    79     //    m_nHead = 0;
    80     m_nHead = m_nHead % m_nCount;
    81     d = m_pData[m_nHead];
    82     m_pData[m_nHead++] = -1; // 把出列的位置置为0xffffffff,便于调试查看
    83     return true;
    84 }
  • 相关阅读:
    docker 如何启动空容器
    dotnet5.0 aspnetcore runtime docker镜像
    abp asp.net core 手动获取容器中的服务
    我把代码写在别人的分支了?别慌,有办法解决
    var重复声明为什么后续声明会被忽略
    flex布局不常用到的属性整理
    微信openID和unionID的区别
    js稀疏数组、密集数组、数组空位、手写数组map方法
    vscode格式化代码换行?试试这个配置
    封装一个公共组件并上传到npm仓库
  • 原文地址:https://www.cnblogs.com/veis/p/12508121.html
Copyright © 2011-2022 走看看