2012-04-16 120 views
1

我在打印隊列中使用的數組內容時遇到問題。在隊列中打印陣列

我的模板隊列的一部分:

#include <iostream> 
#include <cstdlib> 
using namespace std; 

template<class T> 
class Queue 
{ 
private: 
    int front;  //front position 
    int rear;  //rear position 
    int maxQue;  //maximum number of elements in the queue 
    T* items;  //points to a dynamically-allocated array code here 
public: 
    Queue() // default constructor: Queue is created and empty 
    { 
     front = -1; 
     rear = 0; 
     maxQue = 10; 
     items = new T[maxQue]; 
    } 

    void Print() // print the value of all elements in the queue 
    { 
     while(front != rear) 
     { 
      cout<<items[front]; 
      front++; 
      if(front==rear) 
       break; 
      cout<<" - "; 
     } 
     cout<<endl; 
    } 

    void Enqueue(T add)  // insert x to the rear of the queue 
    {       // Precondition: the queue is not full 
     if(IsFull()) 
     { 
      cout<<"Queue is full!"<<endl; 
     } 
     else 
     { 
      items[rear] = add; 
      rear++; 
      rear = rear % maxQue; 
     } 
    } 

    void Dequeue(T &x) // delete the element from the front of the queue 
    {      // Precondition: the queue is not empty 
     if(!IsEmpty()) 
     { 
      front = (front+1)%maxQue; 
      x = items[front]; 
     } 
    } 

    bool IsEmpty() // test if the queue is empty 
    { 
     return (rear==front); 
    } 

    bool IsFull() // test if the queue is full 
    { 
     return ((rear+1)%maxQue==front); 
    } 

    int length() // return the number of elements in the queue 
    { 
     return abs(rear-front); 
    } 

    ~Queue() // Destructor: memory for the dynamic array needs to be deallocated 
    { 
     delete [] items; 
    } 
}; 

主程序的一部分:

int main() 
{ 
    Queue<float>FloatQueue; 
    float y; 
    FloatQueue.MakeEmpty(); 

    FloatQueue.Dequeue(y); 
    FloatQueue.Enqueue(7.1); 
    cout << "float length 3 = " << FloatQueue.length() << endl; 

    FloatQueue.Enqueue(2.3); 
    cout << "float length 4 = " << FloatQueue.length() << endl; 

    FloatQueue.Enqueue(3.1); 
    FloatQueue.Dequeue(y); 
    cout << "The float queue contains: "; 
    FloatQueue.Print(); 

    return 0; 
} 

代碼編譯罰款,直到它試圖打印,在這一點上,我得到這些錯誤。

0 00000000 0x00466a7f in std::__convert_from_v() (??:??) 
1 00000000 0x00430302 in std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_float<double>() (??:??) 
2 00000000 0x00430da8 in std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put() (??:??) 
3 00000000 0x00447455 in std::ostream::_M_insert<double>() (??:??) 
4 00000000 0x00448988 in std::ostream::operator<<() (??:??) 
5 0041CB37 Queue<float>::Print(this=0x28ff00) 

我一直堅持在這幾天現在,任何幫助將不勝感激。

+1

你忘了'#include '? – 2012-04-16 22:12:40

+0

哦,是的,並使用'std :: cout'和**不要**使用'#using命名空間標準;' – 2012-04-16 22:13:16

+0

我確實有#include ,我會編輯我的帖子。沒有使用命名空間std有什麼好處?我對C++有點新鮮。 – 2012-04-16 22:15:43

回答

0

看起來你正在實現一個固定大小的循環緩衝區。如果是的話(或者即使沒有),你有幾個問題:

  1. 如果秋毫出來之前比排隊隊列的最大尺寸更大,它不會註冊爲充分。
  2. 如果你的「前」指針大於你的後指針,你的打印功能將永遠不會停止,並且前端將持續到MAX_INT,並可能再次循環。您沒有對緩衝區的最大大小進行mod操作。
  3. 你沒有析構函數,所以你每次創建和銷燬這些對象時都會泄漏你的緩衝區。
  4. 您的長度功能不正確。任何時候前方比後方都大(這是一半的時間),它將會出錯。這樣想,當它滿了,大小就會說零。

也許除此之外的其他一些事情。我會重新考慮你的設計。你很近,但你有一些數學錯誤。