0

0

c++中如何实现顺序循环队列_c++循环队列入队出队操作

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-14 09:17:46

|

373人浏览过

|

来源于php中文网

原创

取模运算使rear和front在数组末尾后回到开头,实现逻辑环形;队空判front==rear,队满判(rear+1)%capacity==front;rearElement需(rear-1+capacity)%capacity防负。

c++中如何实现顺序循环队列_c++循环队列入队出队操作

为什么 frontrear 要用取模运算

顺序循环队列本质是用一维数组模拟环形结构,物理上数组是线性的,但逻辑上要让 rear 到末尾后回到开头。不用 % size 就会越界——比如数组长度为 5,当前 rear == 4,入队后应变成 0,而不是 5。所有移动操作(rear = (rear + 1) % capacityfront = (front + 1) % capacity)都依赖这个取模,否则就不是“循环”。

如何判断队空和队满(最容易错的两个条件)

顺序循环队列无法靠 front == rear 同时表示空和满,必须牺牲一个存储位置或引入额外变量。主流做法是「牺牲一个位置」:用 (rear + 1) % capacity == front 判满,用 front == rear 判空。这意味着容量为 n 的数组最多存 n-1 个元素。若强行塞满 n 个,frontrear 将再次相等,与队空冲突,导致逻辑崩溃。

  • 判空:front == rear
  • 判满:(rear + 1) % capacity == front
  • 入队前必须先判满,出队前必须先判空
  • 初始化时 front = rear = 0,此时队空

enqueuedequeue 的标准写法(带边界检查)

这两个操作看似简单,但漏掉判空/判满、忘记更新索引、搞反取模对象,都会引发未定义行为。尤其注意:入队是先赋值再动 rear,出队是先取值再动 front;且所有索引更新必须立即取模,不能等到最后算。

class CircularQueue {
private:
    int* data;
    int capacity;
    int front;
    int rear;

public: CircularQueue(int k) : capacity(k + 1), front(0), rear(0) { data = new int[capacity]; }

bool enqueue(int value) {
    if ((rear + 1) % capacity == front) return false; // 队满
    data[rear] = value;
    rear = (rear + 1) % capacity;
    return true;
}

bool dequeue() {
    if (front == rear) return false; // 队空
    front = (front + 1) % capacity;
    return true;
}

int frontElement() {
    if (front == rear) throw std::runtime_error("Queue is empty");
    return data[front];
}

int rearElement() {
    if (front == rear) throw std::runtime_error("Queue is empty");
    return data[(rear - 1 + capacity) % capacity];
}

};

LLaMA-Factory Online
LLaMA-Factory Online

在线大模型训练与微调服务平台

下载

立即学习C++免费学习笔记(深入)”;

为什么 rearElement() 要写成 (rear - 1 + capacity) % capacity

直接写 (rear - 1) % capacityrear == 0 时会得到负数(如 -1),C++ 中负数取模结果仍为负(-1 % 5 == -1),而非预期的 4。加一个 capacity 再取模可强制转正:(0 - 1 + 5) % 5 == 4。这是循环队列里访问“逻辑上 rear 前一个位置”的安全写法,任何涉及减法后取模的地方都要防负。

实际使用中,只要索引计算含减法,就该默认套一层 + capacity 再取模。这不是过度防御,是 C++ 取模语义决定的硬约束。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

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

下载

相关标签:

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

相关专题

更多
php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

1

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

15

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

4

2026.01.13

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.6万人学习

C 教程
C 教程

共75课时 | 4万人学习

C++教程
C++教程

共115课时 | 12.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号