C队列编程问题

时间:2010-08-21 11:10:08

标签: c queue

我正在从一本书中学习排队。作者解释了使用以下代码在队列中插入元素的操作。

#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 ?不应修改此代码,以便它允许填充数组中的最后一个位置,或者我是否遗漏了一些非常明显的东西?

感谢。

5 个答案:

答案 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)