我正在从一本书中学习排队。作者解释了使用以下代码在队列中插入元素的操作。
#define MAX 100
char *p[MAX];
int spos = 0; // spos: holds the index of the **next free** storage location
int rpos = 0;// rpos: holds the index of the next item to retrieve
void qstore(char *q)
{
if(spos==MAX) {
printf("List Full\n");
return;
}
p[spos] = q;
spos++;
}
因此,根据上面的代码,如果 spos = 100,则队列已满,即数组中的最后一个元素。现在,由于 spos 保存下一个免费存储位置的索引,因此当 spos = 100时,数组中的最后一个位置为空。那么为什么它被解释为 List full ?不应修改此代码,以便它允许填充数组中的最后一个位置,或者我是否遗漏了一些非常明显的东西?
感谢。
答案 0 :(得分:5)
p[100]
在索引0到99处分配100个插槽。没有位置100。
答案 1 :(得分:2)
我想因为p[100]
是您可以对您的数组执行的无效访问。
最后一个有效位置是p[99]
另外考虑到使用数组实施队列,请不要将抽象数据类型与其可能的实现混淆
答案 2 :(得分:2)
数组索引从0开始,因此对于MAX == 100,您将拥有0到99之间的有效数组位置。因此,当spos == 99表示数组中的最后一个位置可用时,您可以放入一些内容队列,然后spos增加并实际“指向”一个无效的位置,这意味着列表已满,这实际上是正确的,因为你已经填充了数组中的0 -99位置。
答案 3 :(得分:1)
数组的最后一个元素的索引,如果是99,而不是100。
因此,当spos = 100时,队列真的已满。
答案 4 :(得分:0)