笔记:数据结构(循环队列相关判断条件)


循环队列 中,判断队列的 以及 长度 是关键操作。以下是循环队列的相关判断条件的详细罗列:

1. 判断队列是否为空

条件 :队头指针 front 等于队尾指针 rear

代码实现

复制代码
Cbool IsEmpty(SqQueue Q) {
    return Q.front == Q.rear;
}

解释

  • front == rear 时,队列中没有元素,队列为空。

2. 判断队列是否为满

条件 :队尾指针 rear 的下一个位置是队头指针 front,即 (rear + 1) % MAXQSIZE == front

代码实现

复制代码
Cbool IsFull(SqQueue Q) {
    return (Q.rear + 1) % MAXQSIZE == Q.front;
}

解释

  • 循环队列中,为了区分队列空和队列满的情况,通常会牺牲一个元素空间。
  • (rear + 1) % MAXQSIZE == front 时,队列已满。

3. 计算队列的长度

条件 :队列的长度为 (rear - front + MAXQSIZE) % MAXQSIZE

代码实现

复制代码
Cint QueueLength(SqQueue Q) {
    return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}

解释

  • rear - front 可能为负数(当 rear 绕到 front 前面时),因此加上 MAXQSIZE 确保结果为正。
  • 通过取模运算 % MAXQSIZE,确保结果在 0MAXQSIZE - 1 之间。

4. 入队操作的条件

条件 :队列未满,即 (rear + 1) % MAXQSIZE != front

代码实现

复制代码
CStatus EnQueue(SqQueue &Q, QElemType e) {
    if ((Q.rear + 1) % MAXQSIZE == Q.front) {
        return ERROR; // 队列已满,无法入队
    }
    Q.base[Q.rear] = e; // 将元素插入队尾
    Q.rear = (Q.rear + 1) % MAXQSIZE; // 队尾指针后移
    return OK;
}

解释

  • 如果队列未满,则将元素插入队尾,并将 rear 指针后移。
  • 通过取模运算 % MAXQSIZE,确保 rear 指针在数组范围内循环。

5. 出队操作的条件

条件 :队列不为空,即 front != rear

代码实现

复制代码
CStatus DeQueue(SqQueue &Q, QElemType &e) {
    if (Q.front == Q.rear) {
        return ERROR; // 队列为空,无法出队
    }
    e = Q.base[Q.front]; // 取出队头元素
    Q.front = (Q.front + 1) % MAXQSIZE; // 队头指针后移
    return OK;
}

解释

  • 如果队列不为空,则取出队头元素,并将 front 指针后移。
  • 通过取模运算 % MAXQSIZE,确保 front 指针在数组范围内循环。

6. 队列的初始化

条件 :队头指针 front 和队尾指针 rear 都初始化为 0

代码实现

复制代码
CStatus InitQueue(SqQueue &Q) {
    Q.base = new QElemType[MAXQSIZE]; // 动态分配数组空间
    if (!Q.base) {
        exit(OVERFLOW); // 内存分配失败
    }
    Q.front = Q.rear = 0; // 初始化队头和队尾指针
    return OK;
}

解释

  • 初始化时,队列为空,因此 frontrear 都指向数组的起始位置。

7. 队列的销毁

条件 :释放队列的存储空间,并将 frontrear 置为 0

代码实现

复制代码
CStatus DestroyQueue(SqQueue &Q) {
    if (Q.base) {
        delete[] Q.base; // 释放数组空间
    }
    Q.front = Q.rear = 0; // 重置队头和队尾指针
    return OK;
}

解释

  • 销毁队列时,释放动态分配的数组空间,并将指针重置。

总结

循环队列的关键判断条件如下:

  1. 队列空front == rear
  2. 队列满(rear + 1) % MAXQSIZE == front
  3. 队列长度(rear - front + MAXQSIZE) % MAXQSIZE
  4. 入队条件:队列未满
  5. 出队条件:队列不为空

通过以上判断条件,可以确保循环队列的正确操作。

相关推荐
橘子汽水16814 分钟前
Leetcode 208,207实现Trie前缀树,课程表
java·数据结构·算法·leetcode
bug嘛我经常写17 分钟前
MIKE21结合ArcGIS制作随时间变化的降水文件(.dfs2)-笔记
经验分享·笔记·arcgis
hanlin0318 分钟前
刷题笔记:力扣第169题-多数元素
笔记·算法·leetcode
wabs66633 分钟前
关于二叉树【力扣116.填充每个节点的下一个右侧节点指针的思考】
数据结构·c++·算法·leetcode·二叉树·层序遍历
船厂电气自动化ai大模型36 分钟前
AI大模型与数学 第73课 秩的核心定义、矩阵秩的通用求解方法
开发语言·数据结构·机器学习
动词ing39 分钟前
【学习笔记】数据结构(哈希表基础+哈希集合+哈希映射+计数+查找)
数据结构·学习·哈希算法
kaixin_啊啊40 分钟前
中国研究生数学建模竞赛(华为杯)学习笔记——数据预处理全流程
人工智能·笔记·学习·数学建模·ai·大模型·数据预处理
星云API|微信接口开发4 小时前
企业微信二次开发实战笔记:如何用在线调试快速验证接口功能
数据库·笔记·企业微信
David猪大卫10 小时前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试
不会就选b11 小时前
算法日常・每日刷题--<贪心>7
数据结构·算法·leetcode