当前位置:   article > 正文

C++循环队列(模板类)_c++ 循环队列

c++ 循环队列


一、简介

  • 循环队列是一种基于数组实现的队列数据结构,其特点是队尾队头通过模运算相连,形成一个环形结构。这种设计可以有效地利用数组空间,避免因出队操作导致队列空间的浪费

  • 循环队列通常有两个指针,一个指向队头front),另一个指向队尾rear)。初始时,这两个指针都指向队列的起始位置。当有元素入队时,队尾指针移动到下一个位置;当有元素出队时,队头指针也移动到下一个位置。如果指针达到数组的末尾,它将会绕回到数组的开头,形成一个循环。

  • 循环队列的主要优势在于可以在数组中实现高效的循环操作,而不需要频繁地搬移数据。这对于需要频繁执行入队和出队操作的场景非常有用,比如缓冲区管理、任务调度等。

  • 基本的循环队列操作包括:
    入队(Enqueue: 将元素添加到队尾,同时移动队尾指针。
    出队(Dequeue: 移除队头元素,同时移动队头指针。
    判空(isEmpty: 判断队列是否为空。
    判满(isFull: 判断队列是否已满。

二、系统栈内存下的循环队列具体实现

  • _public.h
#ifndef __PUBLIC_HH                                                                                                                                                [50/33042]
#define __PUBLIC_HH                                                                                                                                                          
                                                                                                                                                                             
#include <iostream>                                                                                                                                                          
#include <cstring>                                                                                                                                                           
#include <algorithm>                                                                                                                                                         
using namespace std;                                                                                                                                                         

template<class TT, int MaxLength>
class squeue
{
 private:
     bool m_inited = false;
     int m_length;
     TT m_data[MaxLength];
     int m_head;
     int m_tail;
     // 禁用拷贝构造函数以及赋值运符
     squeue(const squeue& ss) = delete;
     squeue& operator=(const squeue& ss) = delete;

 public:
     squeue() {init();}
     void init()
     {
        if (m_inited)
            return ;
        m_inited = true;
        m_length = 0;
        // 头尾指针分别处在数组两侧
        m_head = 0;
        m_tail = MaxLength - 1;
        memset(m_data, 0, sizeof(m_data));
     }
     bool push(const TT& value)
     {
        if (is_full())
        {
            cout << "squeue is full...push element failed..." << endl;
            return false;
        }
        // 每次向尾部添加数据时,先将尾结点向后移动一位
        m_tail = (m_tail + 1) % MaxLength;
        m_data[m_tail] = value;
        // 总长度++
        m_length ++ ;
        return true;
     }
     bool is_full()
     {
         if (m_length == MaxLength) return true;
         return false;
     }
     bool is_empty()
     {
         if (!m_length) return true;
         return false;
     }
     TT& front()
     {
        return m_data[m_head];
     }
     bool pop()
     {
         if (!is_empty())
         {
             // 取数据时同样也是先将头指针向后移动,再pop数据
             m_head = (m_head + 1) % MaxLength;
             m_length -- ;
             return true;
         }
         return false;
     }
     int size()
     {
         return m_length;
     }
     void printData()
     {
         for (int i = 0; i < size(); i ++ )
         {
             cout << "q[" << i << "] = " << m_data[(m_head + i) % MaxLength] << endl;
         }
     }
};
#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • demo01.cpp
#include <_public.h>

int main()
{
    using ElementType = int;
    squeue<ElementType, 5> q;
    int a = 1, b = 2, c = 3;
    cout << "元素(" << a << ' ' << b << ' ' << c << ")入队" << endl;
    q.push(a);
    q.push(b);
    q.push(c);
    q.printData();

    ElementType item = q.front();q.pop(); cout << "移除的元素是" << item << endl;
    item = q.front();q.pop(); cout << "移除的元素是" << item << endl;
    cout << "队列的长度是:" << q.size() << endl;
    int d = 8, e = 13, f = 25, g = 20, h = 9;
    cout << "元素(" << d << ' ' << e << ' ' << f << ' ' << g << ' ' << h << ")入队" << endl;
    q.push(8);
    q.push(13);
    q.push(25);
    q.push(20);
    q.push(9);
    cout << "队列的长度是:" << q.size() << endl;
    q.printData();

    return 0;
}                                                                                                                                                 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 输出显示
    在这里插入图片描述
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/707111
推荐阅读
相关标签
  

闽ICP备14008679号