
单片机实现环形队列_第4篇 C++数据结构 -环形队列
发布日期:2021-05-10 05:23:20
浏览次数:19
分类:精选文章
本文共 2628 字,大约阅读时间需要 8 分钟。
循环队列是一种线性数据结构,基于FIFO(先进先出)原理执行操作。它通过在数组的两端分别维持索引计数器来实现。这些计数器允许插入到数组末尾并在超过末尾时环绕到数组开头,从而模拟环形的行为。
环形队列的工作原理
计数器设计:
- 前指针 (
front
) 和 尾指针 (rear
):都初始化为 -1,表示队列为空。 - 数组长度:固定为
DEFAULT_SIZE
,这使得实现简单且效率高。
状态判断:
- 空环:
front
和rear
初始化为 -1。 - 满载状态:
rear
索引为d_maxsize-1
,同时front
为 0。rear
索引小于front
的值 1。
入队操作(enqueue
):
- 检查是否满:
rear
是否等于d_maxsize-1
呢?同时front
是否为 0?- 或者
rear
比front
少 1?
- 若满,输出错误信息返回。
- 处理空环或移动尾指针以防溢出。
出队操作(dequeue
):
- 检查是否为空:
front
为 -1。 - 移动
front
指针,释放元素,处理特殊情况或重置rear
。
队列状态:
- 非空:
front
不为 -1。 - 已满:
rear
达到最大索引或延后指针逼近front
。
性能分析
- 固定长度数组:能快速访问和修改位置,适合频繁操作的场景。
- 常数复杂度:常规操作时间复杂度为 O(1),空间复杂度较小,非常适合缓存场景。
代码实现
#include "../headers/CircleQueue.hh"#define DEFAULT_SIZE 15templateCircleQueue ::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; }
总结
综上所述,环形队列通过固定长度数组和前后索引指针实现,能够在常数时间复杂度内高效完成操作。这一设计在需要频繁随机访问和插入/移除的场景中表现优异,同时易于管理和扩展。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月28日 07时07分06秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
laravel字段自增/自减
2025-04-04
laravel安装问题解决方法
2025-04-04
laravel接入Consul
2025-04-04
Laravel教程 四:数据库和Eloquent
2025-04-04
laravel新版教程之如何安装步骤详细说明
2025-04-04
laravel框架中使用redis时报错
2025-04-04
Laravel框架二
2025-04-04
laravel框架安装报错解决
2025-04-04
laravel框架自定义软删除
2025-04-04
Laravel渴求式加载
2025-04-04
laravel记录
2025-04-04
laravel设置全局方法
2025-04-04
Laravel集合探学系列——添加扩展macro策略(一)
2025-04-04
Laravel项目宝塔部署全攻略:从0到1的实战指南
2025-04-04
Laravel项目源文件修改“免编译生效”大揭秘
2025-04-04
laravl 文件存储云存储
2025-04-04
LARGE_INTEGER
2025-04-04
LaTeX 在线编辑器(LaTeX online editors)
2025-04-04
latex不能识别eps图片
2025-04-04