【问题标题】:C Queue programming problemC队列编程问题
【发布时间】:2010-08-21 11:10:07
【问题描述】:

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

#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呢?不应该修改这段代码,以便填充数组中的最后一个位置,还是我遗漏了一些非常明显的东西?

谢谢。

【问题讨论】:

  • 哈!我想我现在明白了。由于数组的大小是 100,那么数组的最后一个元素实际上是 p[99] 所以 spos=100 表示队列已满。如此简单而常规的概念,我对此感到困惑。 拍拍他的头,然后自言自语地走开
  • 谢谢大家。我不知道我怎么错过了这一点。可怜的我(:
  • 停止阅读“火影忍者”并阅读更多代码:P
  • 与问题完全没有关系,但是为什么代码示例的作者使用了两个不同的索引变量(sposrpos)?似乎最好只需要一个。

标签: c queue


【解决方案1】:

p[100] 在索引 0 到 99 处分配 100 个插槽。没有位置 100。

【讨论】:

    【解决方案2】:

    数组索引从 0 开始,因此对于 MAX == 100,您将拥有介于 0 到 99 之间的有效数组位置。因此,当 spos == 99 表示数组中的最后一个位置可用时,您可以在其中放入一些东西队列,然后 spos 递增并实际上“指向”一个无效位置,这意味着列表已满,这实际上是正确的,因为您已经填充了数组中的 0 -99 个位置。

    【讨论】:

      【解决方案3】:

      我猜是因为p[100] 是您可以对阵列进行的无效访问。 最后一个有效位置是p[99]

      另外考虑到您正在实现队列使用数组,切勿将抽象数据类型与其可能的实现之一混淆

      【讨论】:

        【解决方案4】:

        数组最后一个元素的索引,如果是 99,而不是 100。

        所以当 spos=100 时,队列真的满了。

        【讨论】:

          【解决方案5】:
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-14
          • 2011-09-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多