是否可以使用array
实现循环队列,而无需计数器来计算队列中的项目数或不浪费数组的任何条目?
我猜:
这是不可能的,我们假设我们有两个指针front
和rear
,第一个指向队列的第一个元素,
我们可以用两种方式定义后指针:
1.它指向插入队列的最后一个元素,因此下一个条目是将要插入的下一个元素的可能位置
2.它指向要插入下一个元素的位置
在任何一种情况下,我们无法区分完整和完整;如果我们不浪费数组的至少一个条目或者我们没有保留计数器the number of inserted - number of deleted elements
答案 0 :(得分:5)
您的疑虑通常被视为循环队列的full vs. empty difficulty。引用:
为了解决这种困惑,有许多解决方案:
- 始终打开一个插槽。
- 使用填充计数来区分这两种情况。
- 使用额外的镜像位来区分这两种情况。
- 使用读取和写入计数来获取填充计数。
- 使用绝对指数。
- 记录上次操作。
醇>
您在问题中直接提到的数字1,2和4。除了数组和开始/结束(或命名为前/后)索引/指针之外,它们会消耗一定量的内存。其他解决方案也消耗内存。
#3 - 使用镜像位
只添加一个额外的布尔值或枚举,基本上是isEmpty
或isFull
。这种方法的想法,逻辑和证明是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个或多个元素,就从第一个或最后一个指针偏移一个。
这可能充其量只是使用计数器稍微改善,甚至可能是最差的。