循环队列 bug

1. 题目描述

spfa判断负环

LC 设计循环队列

2. 普通单队列

c++ 复制代码
int q[N];
int hh = 0, tt = -1;
while(hh <= tt) // empty
{
    int t = q[ hh ++ ];	// push
    /* do something */
    q[ ++ tt ] = j;	// pop
}

3. 错误的循环队列

c++ 复制代码
int q[N];
int hh = 0, tt = -1;
while(hh != (tt + 1) % N) // 非空
{
    int t = q[ hh ++ ];	// 出队
    hh %= N;
    /* do something */
    tt = (tt + 1) % N;
    q[tt] = j;	// 入队
}

但这种方法无法区分队空的情况和队满的情况。

例如 N=5,初始时 hh=0,tt=-1,连续 push 5 个元素,hh=0,tt=4,此时有 hh=(tt+1)%N,但此时是队满。

但值得注意的是,这种可发可以过上面 spfa 那一题,不知道是因为数据太弱,还是队满的情况几乎不会发生。

4. 正确写法(带一个空位置)

c++ 复制代码
// N = q.capacity()
int q[N];
int hh = 0, tt = 0;

bool isEmpty()
    return hh == tt;

bool isFull()
    return (tt + 1) % N == hh;

size_t length()
    return (tt - hh + N) % N;

void push(int val)
    assert(!isFull());
    q[tt ++ ] = val;
    tt %= N;

void pop()
    assert(!isEmpty());
    int val = q[hh ++ ];
    hh %= N;

例如,N=5,连续 push 4 个元素,此时 hh=0,tt=4,如果我们再 push,由于 (tt+1)%N==hh,队满,push 失败,因此不会出现队满时 hh==tt 的情况。

相关推荐
三毛的二哥6 小时前
BEV:典型BEV算法总结
人工智能·算法·计算机视觉·3d
南宫萧幕7 小时前
自控PID+MATLAB仿真+混动P0/P1/P2/P3/P4构型
算法·机器学习·matlab·simulink·控制·pid
浪浪小洋8 小时前
c++ qt课设定制
开发语言·c++
charlie1145141918 小时前
嵌入式C++工程实践第16篇:第四次重构 —— LED模板,从通用GPIO到专用抽象
c语言·开发语言·c++·驱动开发·嵌入式硬件·重构
handler018 小时前
Linux: 基本指令知识点(2)
linux·服务器·c语言·c++·笔记·学习
故事和你918 小时前
洛谷-数据结构1-4-图的基本应用1
开发语言·数据结构·算法·深度优先·动态规划·图论
我叫黑大帅8 小时前
为什么map查找时间复杂度是O(1)?
后端·算法·面试
炽烈小老头9 小时前
【每天学习一点算法 2026/04/20】除自身以外数组的乘积
学习·算法
skilllite作者9 小时前
AI agent 的 Assistant Auto LLM Routing 规划的思考
网络·人工智能·算法·rust·openclaw·agentskills
香蕉鼠片10 小时前
MFC是什么
c++·mfc