我们刚刚在课堂上学习循环队列,我有几个问题.因为我们将尾部定义为最后一个值旁边的空白区域,如下所示:
|1| |3|4|5|6|
Run Code Online (Sandbox Code Playgroud)
头部将指向数字3,尾部将指向1到3之间的空白空间.我对如果该空间被填满会发生什么感到困惑,例如下面:
|1|2|3|4|5|6|
Run Code Online (Sandbox Code Playgroud)
然后头部仍然指向3,但是尾部需要指向前面空白框之后的下一个框,因此它将指向3或标题.我该怎么办?
发生这种情况时,您的队列已满.在处理可以推送的新项目时,您有几个选项:
丢弃推送事件:仅当弹出其他项目时,现在可以再次按下项目.既不是也head
没有tail
更新.
示例:考虑已填满的事件队列,简单忽略新请求.
丢弃(POP)队列中的最早的事件:在这种情况下,你更新都将head
和tail
指针一个地方.
示例:缓冲从网络摄像头接收图像帧以进行处理.对于"实时"Feed,您可能更喜欢在处理过程中丢弃较旧的帧.
创建一个更大的队列:即,动态分配更多内存
示例:您使用循环队列,因为它是一种高效的实现,在推送项目时大多数时间不需要内存分配.但是,您不希望丢失队列中的项目,以便允许偶尔重新分配更多内存
正确的行动取决于您的申请.
PS.:您的实现基于在队列中保留一个空槽来区分完整和空缓冲区.另一种选择是保持队列中元素数量的计数器以进行区分.更多信息可以在循环缓冲区(维基百科)上找到.