2014-09-24 76 views
0

在这个C++代码中,我写了一个队列(FIFO)的基本代码。但out()函数似乎不起作用,它会将最旧的输入返回到数组中。当函数首先被调用时,它就起作用了。但第二次没有。这里是代码: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(); 
} 
+1

你真的需要更具体而不是说“不行”。 – 2014-09-24 16:51:45

+0

当第一次调用它时返回101 ..(q.in(101)),但当第二次调用时,它返回值如101432,56723等。 – raiyan106 2014-09-24 16:53:16

+2

'return que [ - index-f];'在这行之后,函数中没有更多内容会被执行。 – 2014-09-24 16:55:53

回答

1

这是因为您在修改f和索引之前从函数返回。另外,如果队列已满,该函数可以结束而不返回任何内容。

0

如前所述,您的代码永远不会过去return que[--index-f];因此,您应该重新对代码进行重新排序,以便索引不会被修改,并且f在执行该语句之前被修改,例如,

f--; 
return que[index-f-2]; 

您的索引的增量和减量是没有必要的,所以不要这样做。即使发生这种变化,你的代码也不会执行所要求的行为,你的in()函数实际上也是错误的。如果在调用out函数之后向队列中添加数字,则可以设置f=index,您将在初始输入中重置该数字。最后,你的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; 
}