当前位置: 首页 > 知识库问答 >
问题:

循环队列中的满/空缓冲区区分

羊舌勇
2023-03-14

循环队列的数组实现中,如果在第一个元素之前指向一个插槽,而在最后一个元素之后指向一个插槽,则会面临如何识别队列是满还是空的问题。

为了解决这个问题,我们要么使用计数器,要么在缓冲区中浪费一个空间。

我在想下面的方法。请纠正我的错误,如果没有请让我知道这是一个更好/更差的解决方案比以上。

    null

共有1个答案

谢泽语
2023-03-14

这种方法在逻辑上没有太大的错误。您将frontfreel中的负值视为一种标志,以指示队列为空。假设更新frontfreed的逻辑将值保持在0...size范围内,则只需将其中一个值设置为超出该范围即可指示队列为空。

考虑一下这个选择。许多循环队列使用frontfreed索引作为无符号值,size作为2的幂。它们的值的更新总是递增的,并且允许它们环绕。这避免了调整这些指数的复杂逻辑。由于索引是无符号的,即使它们是环绕的,差分算术也可以正确地确定元素的数量。

即使索引在增量上缠绕,模数仍然工作的诀窍是size是2的幂。这确保了环绕不影响模的计算。

unsigned front_ = 0, rear_ = 0;
Type q_[SIZE];

unsigned getCount () { return rear_ - front_; }
bool isEmpty () { return getCount() == 0; }
bool isFull () { return getCount() == SIZE; }
bool enQ (Type val) {
    bool result = !isFull();
    if (result) q_[rear_++ % SIZE] = val;
    return result;
}
bool deQ (Type *val) {
    bool result = !isEmpty();
    if (result) *val = q_[front_++ % SIZE];
    return result;
}
 类似资料:
  • 问题内容: 我想在python中创建一个高效的循环缓冲区(目标是取缓冲区中整数值的平均值)。 这是使用列表收集值的有效方法吗? 什么会更有效(为什么)? 问题答案: 我会用一个arg 在文档中有一个与您想要的菜谱相似的菜谱。我断言它是最有效的,这完全取决于它是由C语言实现的,这是由一个熟练掌握了一流代码的技术人员组成的。

  • 本文向大家介绍C#环形缓冲区(队列)完全实现,包括了C#环形缓冲区(队列)完全实现的使用技巧和注意事项,需要的朋友参考一下 公司项目中经常设计到串口通信,TCP通信,而且大多都是实时的大数据的传输,然后大家都知道协议通讯肯定涉及到什么,封包、拆包、粘包、校验……什么鬼的概念一大堆,说简单点儿就是要一个高效率可复用的缓存区。按照码农的惯性思维就是去百度、谷歌搜索看有没有现成的东西可以直接拿来用,然而

  • 环型缓冲区是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。 构造环型缓冲区 var ringBuffer = new RingBufferStream(); 函数原型 RingBufferStream(int capacity = 8192, bool exposable = true); 参数 描述 capacity 环状缓冲区的最大容量,为2的次方。如:传入12,则

  • 环形缓冲区接口 结构体 struct   rt_ringbuffer   环形缓冲区控制块 更多...   枚举 函数 void  rt_ringbuffer_init (struct rt_ringbuffer *rb, rt_uint8_t *pool, rt_int16_t size)   初始化环形缓冲区   void  rt_ringbuffer_reset (struct rt_rin

  • 问题内容: 考虑几个并行运行的Web服务器实例。每个服务器都有对单个共享“状态保持器”的引用,该角色的作用是保留来自所有服务器的最新请求。 例如(): 在任何时间点,都可以从监视应用程序中调用“状态保持器”,该应用程序读取了最近的SLA报告请求。 在Java中实现这种生产者-消费者方案的最佳方法是什么,使Web服务器具有比SLA报告更高的优先级? CircularFifoBuffer似乎是容纳请求

  • 问题内容: 我有一个流时间序列,我有兴趣保留最后4个元素,这意味着我希望能够弹出第一个元素并将其添加到末尾。本质上我需要一个环形缓冲区。 哪个Java集合最适合此用途?向量? 问题答案: 考虑CircularFifoBuffer Apache的Common.Collections。与Queue不同,你不必维护基础集合的有限大小,只要达到极限就可以包装它。 由于以下属性,CircularFifoBu