C++怎么用数组模拟队列Queue的入队和出队

浅敏吖_4655

浅敏吖_4655

2026-09-22

876人浏览

原创

不能直接用 front = 0 和 rear = -1 初始化,因为首次 push 后两者均为 0,无法区分空队列与单元素队列;应初始化为 front = rear = 0,并采用“牺牲一个位置”判满:(rear + 1) % n == front。

c++怎么用数组模拟队列queue的入队和出队

用数组模拟队列时,为什么不能直接用 front = 0rear = -1 初始化?

因为这样会导致第一次 push()rear 变成 0,而 front 也是 0,无法区分「空队列」和「一个元素的队列」。更稳妥的做法是让 frontrear 都初始化为 0,并约定:队列为空当且仅当 front == rear;队列为满需额外判断(如预留一个空位或用计数器)。

常见错误现象:pop() 后取不到值、push() 覆盖旧数据、判空/判满逻辑总出错。

  • 推荐用「牺牲一个位置」方式判满:即容量为 N 的数组,最多存 N-1 个元素,满条件为 (rear + 1) % N == front
  • 所有移动都用模运算:rear = (rear + 1) % Nfront = (front + 1) % N,避免下标越界
  • 入队前必须先检查是否已满,出队前必须先检查是否为空——否则访问非法内存

push()pop() 的核心逻辑怎么写才不出错?

关键不是“放进去”或“拿出来”,而是维护好 frontrear 和数组内容三者的一致性。尤其注意:入队操作修改 rear,但赋值发生在移动前还是移动后,决定了你对「当前空位」的理解。

标准写法(先赋值再移动 rear):

void push(int x) {
    if (isFull()) throw std::runtime_error("Queue is full");
    arr[rear] = x;
    rear = (rear + 1) % capacity;
}

对应地,pop() 应该先取 arr[front],再移动 front

C++ 算法竞赛自动化测试数据生成与校验框架
C++ 算法竞赛自动化测试数据生成与校验框架

根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。

下载
int pop() {
    if (isEmpty()) throw std::runtime_error("Queue is empty");
    int val = arr[front];
    front = (front + 1) % capacity;
    return val;
}
  • 如果反过来(先移 rear 再赋值),就要把初始 rear 设为 -1,但会增加边界判断负担
  • 不要在 pop() 里直接返回 arr[front++] —— 没做模运算,front 会溢出
  • 返回值类型建议明确为 int 或模板类型,别用 void 配引用参数,易混淆所有权

为什么用 std::vector 替代裸数组反而容易翻车?

因为 std::vector::size() 是当前元素个数,不是容量;而数组模拟队列依赖的是「固定容量下的循环下标」。vector 动态扩容会重排内存,导致原有 front/rear 下标全部失效。

除非你彻底放弃循环数组思路,改用两个栈或 deque,否则请坚持用 new int[N]std::array<int n></int>

  • std::array 更安全:编译期定长、无堆分配、支持 at() 边界检查
  • 若真要用 vector,必须调用 reserve(N) 并禁止任何可能触发扩容的操作(如 push_back
  • 调试时打印 frontrearcapacity 和实际数组内容,比单看输出值更能定位错位问题

测试时最容易忽略的边界场景有哪些?

不是只测「连 push 5 个再 pop 5 个」,而是要验证下标绕回、跨零点操作、满/空切换瞬间的行为。比如:

  • 容量为 3 的队列,push 2 个 → pop 1 个 → push 2 个(此时应报满)
  • push 1 个 → pop 1 个 → 再 push 1 个:检查 frontrear 是否回到相同值但队列非空
  • 连续 pop 直到空,再 pop:必须抛异常,而不是静默返回垃圾值
  • 用负数或极大数测试,确认模运算不被符号影响(% 在 C++ 中对负数结果为负,建议用 (x % N + N) % N 做安全取模)

绕回逻辑一旦写错,bug 表现往往延迟出现——前面看着正常,跑到第 7 次 push 才崩,这时候回头查 rear 的更新顺序最省时间。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2068

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

959

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

367

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

307

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

346

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

560

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1389

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1177

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1305

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ 手册教程
C++ 手册教程

共41课时 | 77.9万人学习

Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习