在c中创建一个FIFO队列
问题描述:
我正在尝试编写一个FIFO队列,它将数据存入并且一旦完成后释放最旧的数据以为新数据腾出空间。在c中创建一个FIFO队列
我在编程新的,但设法想出下面的代码:
int Q[size], f=0, r=-1;
int Qfull()
{
if (r==size) return 1;
return 0;
}
int Qinsert()
{
if(Qfull())
{
elem=Q[f];
f=f+1;
return elem;
r++;
Q[r]=SPI1BUF;
}
else
{
r++;
Q[r]=SPI1BUF;
}
}
我遇到的问题是,这不移位数据,并会失败阵列一次充满由于与r增加超过阵列大小。有什么办法可以解决这个问题吗?
答
您正试图创建一个循环队列,而无需执行额外的步骤来完成该工作。您需要这样做(如cHao所述)或使用链接列表进行调查。我建议朝循环队列工作,因为它不需要太多修改。
另外,你的if/else子句中都有相同的两行。你应该能够移动这两条线,并节省自己,如果条款。我不是100%的逻辑,所以确保它可以在if语句之前。
int Qinsert()
{
r++;
Q[r]=SPI1BUF;
if(Qfull())
{
//...
}
}
http://www.cs.bu.edu/teaching/c/queue/array/types.html – SQLMason
既然你学习这么直接的代码可能不是你最好的答案。我建议你看看上面的链接和/或问你的代码的具体问题更直接的问题:)你的QFull大小检查是错误的,因此它会一旦它填满时崩溃。 –
如果您的队列的大小是固定的,您可能需要考虑使用环形缓冲区。有两个指针,一个指向第一个元素,另一个指向下一个应该去的位置。当你删除一个元素时,只需增加“最后一个元素”指针;如果它等于'Q + size',则将其设置为'Q'。 – cHao