【问题标题】:Circular queue size [duplicate]循环队列大小[重复]
【发布时间】:2012-08-23 22:33:56
【问题描述】:

可能重复:
how to find number of elements in a Circular Queue

我正在实现一个循环队列,但我无法正确获取队列的大小。 我发现了一个关于相同问题的先前主题,提出的解决方案是使用两个指针并增加第二个指针,而它并不指向与第一个指针相同的对象。但我认为这种方法只有在队列中有不同对象时才能工作。就我而言,所有对象都是相似的。如何获得循环队列的大小? 这个公式对我也不起作用:

int size = abs(m_front -m_tail) ; 

其中 m_front 和 m_tail 是尾部和前端队列索引。

谢谢

【问题讨论】:

  • 问:您的队列是作为数组实现的吗?如果它只是一个链表,那么你能做的最好的就是确定什么时候 front == tail;您无法确定“大小”,除非您自己记数。
  • @paulsm4 :是的,它被实现为一个数组。当front==tail时,仅表示数组为空。
  • @KingsIndian : 是的,这是同一个问题,这就是我在我的消息中谈论的主题
  • @user16841 对。你必须解释为什么这些答案对你不起作用。为什么存储的对象类型与您有关?指针指向队列本身,而不是存储的对象。

标签: pointers size circular-buffer


【解决方案1】:

应该这样做:

if m_front > m_tail 
    size = (m_front - m_tail)
else
    size = (m_front + N - m_tail)

其中 N 是数组的长度。

或者,您可以自己跟踪它,当您 Queue() 时增加一个计数器,当您 Dequeue() 时减少它。

【讨论】:

  • 请注意,只有头部和尾部索引,如果您允许填充所有N 位置,则无法确定列表是空的还是满的。速度的最佳解决方案是防止最后一个位置被填充,而存储的最佳解决方案是在 Push 和 Pop 操作期间保持 emptyfull 标志。
  • 感谢您的回复。我不知道为什么,但上面的公式不起作用:它总是给我一个零结果....关于你的第二个命题,当我们尝试增加和减少队列时,这个过程不会造成访问竞争同时的大小(并行入队和出队)??
  • 如果你使用线程,你应该使用相同的锁对象来围绕它(和你的队列/出队方法)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 2022-11-27
  • 2019-08-16
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
相关资源
最近更新 更多