当前位置: 首页 > news >正文

循环队列 bug

1. 题目描述

spfa判断负环

LC 设计循环队列

2. 普通单队列

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

3. 错误的循环队列

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. 正确写法(带一个空位置)

// 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 的情况。

相关文章:

  • CCF-CSP认证题目练习及其题解(4
  • Java单例设计模式详解
  • Java虚拟机面试题:垃圾收集(下)
  • CEF 给交互函数, 添加控制台是否显示交互参数log开关
  • Hive工作所遇问题之Hive -e命令中使用正则表达式问题
  • 【C++笔记】C++IO流的深度剖析
  • MATLAB R2024b安装及激活方法
  • C++ stack容器总结
  • 数字转换(c++)
  • 小样本微调大模型
  • 【Go万字洗髓经】Golang中sync.Mutex的单机锁:实现原理与底层源码
  • 一文速通Python并行计算:03 Python多线程编程-多线程同步(上)—基于互斥锁、递归锁和信号量
  • 3.3 Taylor公式
  • ROC 曲线与 AUC 计算:模型评估的深度解析
  • Spring----ioc
  • 解读GM2D二维码在线平台:全球二维码迁移计划的创新
  • WEB安全--SQL注入--利用log写入webshell
  • 您的数据是如何出现在暗网上的?
  • 深度学习论文: Image Segmentation Using Text and Image Prompts
  • 2025年IT行业技术革命全景解析:从AI到量子计算的落地实践
  • 荷兰外交大臣费尔德坎普将访华
  • 一周人物|收藏家瓦尔特捐出藏品,女性艺术家“对话”摄影
  • 关税影响下沃尔玛想涨价,特朗普施压:自行承担,别转嫁给顾客
  • 浙江一家长称小学老师打孩子还威胁要从3楼扔下,当地警方已立案
  • 时隔3年,持续近2小时,俄乌在土耳其谈成了什么?
  • 又一例!易方达基金张坤卸任副总职务,将专注于投资管理工作