单片机实现环形队列_第4篇 C++数据结构 -环形队列
发布日期:2021-05-10 05:23:20 浏览次数:19 分类:精选文章

本文共 2628 字,大约阅读时间需要 8 分钟。

循环队列是一种线性数据结构,基于FIFO(先进先出)原理执行操作。它通过在数组的两端分别维持索引计数器来实现。这些计数器允许插入到数组末尾并在超过末尾时环绕到数组开头,从而模拟环形的行为。

环形队列的工作原理

  • 计数器设计

    • 前指针 (front)尾指针 (rear):都初始化为 -1,表示队列为空。
    • 数组长度:固定为 DEFAULT_SIZE,这使得实现简单且效率高。
  • 状态判断

    • 空环frontrear 初始化为 -1。
    • 满载状态
      • rear 索引为 d_maxsize-1,同时 front 为 0。
      • rear 索引小于 front 的值 1。
  • 入队操作(enqueue

    • 检查是否满:
      • rear 是否等于 d_maxsize-1 呢?同时 front 是否为 0?
      • 或者 rearfront 少 1?
    • 若满,输出错误信息返回。
    • 处理空环或移动尾指针以防溢出。
  • 出队操作(dequeue

    • 检查是否为空:front 为 -1。
    • 移动 front 指针,释放元素,处理特殊情况或重置 rear
  • 队列状态

    • 非空front 不为 -1。
    • 已满rear 达到最大索引或延后指针逼近 front
  • 性能分析

    • 固定长度数组:能快速访问和修改位置,适合频繁操作的场景。
    • 常数复杂度:常规操作时间复杂度为 O(1),空间复杂度较小,非常适合缓存场景。

    代码实现

    #include "../headers/CircleQueue.hh"
    #define DEFAULT_SIZE 15
    template
    CircleQueue
    ::CircleQueue()
    {
    d_front = d_rear = -1;
    d_maxsize = DEFAULT_SIZE;
    d_size = 0;
    d_arr = new T[d_maxsize];
    }
    template
    CircleQueue
    ::CircleQueue(size_t size)
    {
    d_front = d_rear = -1;
    d_maxsize = size;
    d_size = 0;
    d_arr = new T[size];
    }
    template
    CircleQueue
    ::~CircleQueue() { delete[] d_arr; } template
    bool CircleQueue
    ::is_full() const { return (d_rear == d_maxsize - 1 && d_front == 0) || (d_rear == d_front - 1); } template
    bool CircleQueue
    ::is_empty() const { return d_front == -1 || d_rear == -1; } template
    void CircleQueue
    ::enque(const T& value) { if (is_full()) { std::cout << "环形队列已满" << std::endl; return; } else if (d_front == -1) { d_rear = d_front = 0; } else if (d_rear == d_maxsize - 1 && d_front != 0) { d_rear = 0; } else { d_rear++; } d_arr[d_rear] = value; d_size++; } template
    T CircleQueue
    ::deque() { if (is_empty()) { std::cout << "环形队列为空!!" << std::endl; return T(); } T data = d_arr[d_front]; if (d_front == d_rear) { d_front = -1; d_rear = -1; } else if (d_front == d_size - 1) { d_front = 0; } else { d_front++; } d_size--; return data; } template
    T CircleQueue
    ::front() const { return d_arr[d_front]; } template
    T CircleQueue
    ::rear() const { return d_arr[d_rear]; } template
    size_t CircleQueue
    ::size() const { return d_size; } template
    const T* CircleQueue
    ::buffer() { return d_arr; } template
    std::ostream& operator<<(std::ostream& os, CircleQueue
    & q) { const T* buf = q.d_arr; if (q.d_front == -1) { os << "CircleQueue为空"; return os; } if (q.d_rear >= q.d_front) { for (size_t i = q.d_front; i <= q.d_rear; ++i) { os << buf[i] << ","; } } else { for (size_t i = q.d_front; i < q.d_size; ++i) { os << buf[i] << ","; } for (size_t i = 0; i <= q.d_rear; ++i) { os << buf[i] << ","; } } os << std::endl; return os; }

    总结

    综上所述,环形队列通过固定长度数组和前后索引指针实现,能够在常数时间复杂度内高效完成操作。这一设计在需要频繁随机访问和插入/移除的场景中表现优异,同时易于管理和扩展。

    上一篇:1到100的偶数之和是多少_茅台酒回收价多少钱 2021茅台回收价格表一览
    下一篇:c++使用netsh命令_Win10系统安装后IE浏览器无法使用的三种解决方法

    发表评论

    最新留言

    路过,博主的博客真漂亮。。
    [***.116.15.85]2025年04月28日 07时07分06秒