我想知道为什么循环队列中的tail必须指向一个空元素? 众所周知,循环队列的容量为(N-1),因为它必须为队列留出一个空白空间来判断队列是否已满。但是在我看来,这是因为尾指针必须指向一个空元素,如果可以指向最后一个元素而不是空元素,则它可以填充队列中的所有空间。 所以我想知道为什么我们将循环队列设计为这种格式,非常感谢!
答案 0 :(得分:0)
对不起,我注意到我错了…… 如果尾指针指向最后一个元素,而不是最后一个(element + 1),则如果tail == front,则我们无法知道队列是否为空或仅填充了一个元素。这样会引起一些问题。
答案 1 :(得分:0)
在尾部指针指向要填充的下一个元素的地方(并且没有“总是空”元素),有两个条件我们无法区分。这些是“队列已满”和“队列为空”条件,它们的头和尾具有相同的值。
H,T
+---+---+---+---+---+
empty: | - | - | - | - | - |
+---+---+---+---+---+
+---+---+---+---+---+
full: | 5 | 1 | 2 | 3 | 4 |
+---+---+---+---+---+
H,T
根据您的问题,您已经知道了很多。
但是,如果您使用尾指针指向填充的 last 元素,则 still 无法区分这两个条件。
那是因为一个元素的队列的首尾相等,因此,为了表示 empty 队列,尾巴应该在头部的前面(如果不这样做, (“空队列”和“一个项目的队列”条件)是无法区分的。不幸的是,如果您吃饱了,情况也是如此:
T H
+---+---+---+---+---+
empty: | - | - | - | - | - |
+---+---+---+---+---+
+---+---+---+---+---+
full: | 5 | 1 | 2 | 3 | 4 |
+---+---+---+---+---+
T H
最重要的是,无论选择哪种方案,头部和尾部足够的信息不足以唯一地标识所有条件,这就是为什么存在空单元格的原因。
您可以以所需的方式执行操作(尾部指向要填充的最后一个单元格,而不是要填充的下一个单元格),但是您仍然 需要空单元格区分空白案例和完整案例。
当然,您也可以通过在数据结构中引入 count 来解决问题。一旦有了这些,就可以轻松地区分情况(在两种情况下)。