在这个c ++代码中,我编写了一个队列(FIFO)的基本代码。但是out()函数似乎不起作用,它会将最旧的输入返回到数组中。首先调用该函数时,它可以正常工作。但第二次没有。这是代码:
#include<iostream>
using namespace std;
class Queue {
int que[100];
int index=0;
int f;
public:
void in(int num);
int out();
};
void Queue::in(int num){
if(index==100)
cout<<"Que is full\n";
else{
que[index]=num;
f=index;
index++;
}
}
int Queue::out(){
if(index==0)
cout<<"Queue is empty\n";
else{
if(f>=0){
return que[--index-f];
index++;
f--;
}else{
cout<<"Queue is empty";
return 0;
}
}
}
int main(){
Queue q;
q.in(101);
q.in(202);
q.in(303);
q.in(404);
cout<<q.out()<<"\n";
cout<<q.out()<<"\n";
cout<<q.out();
}
答案 0 :(得分:1)
那是因为你在修改f和索引之前从函数返回。此外,如果队列已满,函数可以在不返回任何内容的情况下结束。
答案 1 :(得分:0)
如上所述,您的代码永远不会过去return que[--index-f];
所以您应该重新排序代码,以便在执行该语句之前不修改索引并修改f,例如。
f--;
return que[index-f-2];
索引的增量和减量不是必需的,所以不要这样做。即使进行了此更改,您的代码也不会执行所述的所需行为,您的in()
函数实际上也是错误的。通过设置f=index
如果在调出out函数后向队列中添加数字,则会在初始输入处重置通过它的进度。最后,你的out函数实际上并没有从队列中删除第一个条目。
除非迫切需要不利用动态分配,否则我建议您从使用数组转移到std::vector
。然后,您的Queue类将具有动态队列大小,您可以在创建对象时更改该大小。见下文:
class Queue{
private:
std::vector<int> que;
int maxSize;
public:
Queue(int size=100);
~Queue();
void in(int num);
int out();
};
Queue::Queue(int size):maxSize(size) {}
Queue::~Queue() {}
void Queue::in(int num)
{
if(que.size() >= maxSize)
std::cout << "Que is full\n";
else
que.push_back(num);
}
int Queue::out()
{
if(que.empty())
{
std::cout << "Queue is empty\n";
//optionally throw an error here if you really want the program to not return a number
return 0;
}
int returnVal = que.front();
que.erase(que.begin());
return returnVal;
}