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


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

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

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

相关推荐
三品吉他手会点灯1 小时前
嵌入式机器学习 - 学习笔记1.1.2 - 机器学习的局限性与伦理
人工智能·笔记·嵌入式硬件·学习·机器学习
Hesionberger2 小时前
快速求解完全平方数的最少数量
开发语言·数据结构·python·算法·leetcode·c#
鱼子星_2 小时前
【C++】类和对象(下)——初始化列表,类型转换,static成员,友元,内部类,匿名对象,编译器的优化拓展
c语言·c++·笔记
千寻xun10 小时前
一、理论篇-NVME协议学习笔记
笔记·学习·fpga开发·nvme ssd·nvme协议
奋发向前wcx13 小时前
P2590 树的统计 题目解析
数据结构·算法·深度优先
额鹅恶饿呃15 小时前
C语言中的数据结构和变量
c语言·数据结构·算法
Piko61416 小时前
锐捷 VSU 虚拟化堆叠配置
运维·网络·笔记
AOwhisky16 小时前
Python 学习笔记(第三期)——流程控制:条件判断与循环结构
运维·笔记·python·学习·云原生·流程控制·循环
万法若空17 小时前
【数据结构-哈希表】哈希表原理
数据结构·算法·散列表