2014-09-24 100 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; 
}