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


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

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. 出队条件:队列不为空

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

相关推荐
_Narcissus_13 小时前
排序算法总结表格
c语言·数据结构·c++·笔记·算法·排序算法·总结
一只小小的芙厨14 小时前
前缀和与差分
数据结构·算法
一只小小的芙厨15 小时前
最短路总结
数据结构·算法
Shell运维手记15 小时前
Linux (挂载|rpm|yum|源码编译)
linux·运维·笔记·网络协议·bash
2kπ16 小时前
QT开发笔记
开发语言·笔记·qt
江屿风16 小时前
【STM32基础篇】【嵌入式生态问题及历史追溯】流食般投喂
大数据·开发语言·人工智能·笔记·stm32·嵌入式硬件
zjxtxdy16 小时前
stm32usart通信接口
网络·笔记
来一碗刘肉面17 小时前
有向无环图 DAG(描述表达式)
数据结构
FTS苏州运营部-富港包装检测技术18 小时前
YY/T 0681.3‑2010 无约束包装抗内压破坏试验 技术笔记
笔记·yy/t 0681.2·yy/t 0681.3·yy/t 0681.9·astm f1140·无约束包装·astm f2054
郝学胜_神的一滴18 小时前
干货版《算法导论》18:遍历增删原理、时间复杂度与集合序列实现全解
数据结构·算法