循环队列没有浪费条目或使用计数器

时间:2013-06-21 15:46:34

标签: arrays queue computer-science

是否可以使用array实现循环队列,而无需计数器来计算队列中的项目数或不浪费数组的任何条目?

我猜:

这是不可能的,我们假设我们有两个指针frontrear,第一个指向队列的第一个元素,

我们可以用两种方式定义后指针:

1.它指向插入队列的最后一个元素,因此下一个条目是将要插入的下一个元素的可能位置

2.它指向要插入下一个元素的位置

在任何一种情况下,我们无法区分完整和完整;如果我们不浪费数组的至少一个条目或者我们没有保留计数器the number of inserted - number of deleted elements

,那么空队列

4 个答案:

答案 0 :(得分:5)

您的疑虑通常被视为循环队列的full vs. empty difficulty。引用:

  

为了解决这种困惑,有许多解决方案:

     
      
  1. 始终打开一个插槽。
  2.   
  3. 使用填充计数来区分这两种情况。
  4.   
  5. 使用额外的镜像位来区分这两种情况。
  6.   
  7. 使用读取和写入计数来获取填充计数。
  8.   
  9. 使用绝对指数。
  10.   
  11. 记录上次操作。
  12.   

您在问题中直接提到的数字1,2和4。除了数组和开始/结束(或命名为前/后)索引/指针之外,它们会消耗一定量的内存。其他解决方案也消耗内存。

#3 - 使用镜像位

只添加一个额外的布尔值或枚举,基本上是isEmptyisFull。这种方法的想法,逻辑和证明是more complicated

#5 - 绝对指数

执行操作时指数会递增,并且永不减少。它们本质上是所执行的每种类型的操作数量的计数器。这有other drawbacks

#6 - 记录上一次操作

基本上与#3相同,但语义不同。

无论如何,所有这些链接都是维基百科文章。我强烈推荐它。可能还有其他方法,但很难改进您文章中列出的6种方法之一。它们都有缺点和优点,因此在确定实现之前,请仔细考虑预期的用例。

答案 1 :(得分:1)

正如我曾经实施的那样,我使用了一个名为'empty'的额外bool。 你是对的,在两个指针都在同一个位置的情况下无法区分。

根据您使用的指针,您可以使用一个指针的最低位来存储空变量 如果size是一个变量整数,你也可以使用一个负值来表示队列没有元素。

答案 2 :(得分:1)

在开始时,让first = 0,rear = -1;

我们按以下方式添加它...... array [rear];后部=(后部+ 1)%MAX;

我们按照以下方式删除它.. array [front];前面=(前+ 1)%MAX;

从数组中删除元素时,我们可以在其后面添加一个条件如下...
if(front==rear+1) first=0, rear=-1

然后空状态可以给出......

if(rear==-1) printf("Empty");

完整的条件将是......

if ( ( front==(rear+1) || (front==0 && rear==(n-1) ) && rear!=-1 ) printf("Full");

这可能有效。没有使用“计数”功能

答案 3 :(得分:0)

另一种方法是使用三个指针,其中第三个指针指向两个指针之间的位置。有许多方法可以实施。需要注意的关键是中间指针只需要告诉以下两件事。

  • 队列为空。所有指针都指向同一个地方(后指针的第二个定义)。
  • 队列有1个元素,删除元素会使其为空。中指针和另一个指针指向同一个地方。

这可以简单地通过将中间指针保持在第一个和最后一个之间来完成,并且只要队列具有1个或多个元素,就从第一个或最后一个指针偏移一个。

这可能充其量只是使用计数器稍微改善,甚至可能是最差的。