C++資料結構 9 順序佇列
阿新 • • 發佈:2018-12-14
佇列:先進先出(FIFO)或者後進後出(LILO)
#ifndef __QUEUE_H_ #define __QUEUE_H_ #include <iostream> #include <algorithm> using namespace std; template <class T> class Queue { public: Queue(int capacity=10); //建構函式預設大小為10 ~Queue(); //解構函式 釋放myqueue bool isEmpty ()const; //判斷是否為空 // bool isFull ()const; //判斷是否佇列滿 T& Front()const; //檢視隊首元素 T& Rear()const; //檢視隊尾元素 void Push(const T &item); //入佇列 void Pop(); //出佇列 private: T *myqueue; int Capacity; //佇列大小 int myFront; //隊首下標 int MyRear; //隊尾下標 }; template<class T> Queue<T>::Queue(int capacity):Capacity(capacity) //初始化建構函式 { if(capacity<1) throw "Error"; //引發異常 myqueue=new T[capacity]; //動態建立一個數組 myFront=MyRear=0; //隊首和隊尾指向0 } template<class T> Queue<T>::~Queue() { delete []myqueue; } template<class T> bool Queue<T>::isEmpty () const //判斷是否為空 { return myFront==MyRear; } template<class T> T& Queue<T>::Front() const //檢視隊首元素 { if(isEmpty()) throw "Queue is Empty"; return myqueue[(myFront+1)%Capacity]; //因為myFront指向的佇列不包含資料,所以第一個資料是myFront+1,因為組成迴圈佇列,所以%Capacity } template<class T> T& Queue<T>::Rear() const //檢視隊尾元素 { if(isEmpty()) throw "Queue is Empty"; return myqueue[MyRear]; //返回隊尾資料 } template<class T> void Queue<T>::Push(const T& item) //從隊尾(rear)插入資料 { if(((MyRear+1)%Capacity)==myFront) { T *temp=new T[Capacity*2]; //擴大兩倍大小 int start=(myFront+1)%Capacity; if(start<2) //rear沒有迴環 { copy(myqueue+start,myqueue+start+Capacity-1,temp); //複製資料到temp裡面 } else //產生迴環 需要複製兩次 { copy(myqueue+start,myqueue+start+Capacity-1,temp); copy(myqueue,myqueue+MyRear+1,temp+Capacity-start); } myFront=2*Capacity-1; //把front重新歸位 MyRear=Capacity-1; Capacity=Capacity*2; delete []myqueue; //刪除原資料 myqueue=temp; //把新指標重新賦值給muqueue } else { MyRear=(MyRear+1)%Capacity; //MyRear+1 } myqueue[MyRear]=item; } template <class T> void Queue<T>::Pop() //出佇列 { if(isEmpty()) throw "Queue is Empty"; myFront=(myFront+1)%Capacity; myqueue[myFront].~T(); } #endif // __QUEUE_H_
main函式:
#include <iostream> #include "Queue.h" using namespace std; int main() { Queue<int> q; q.Push(11); q.Push(10); q.Push(2); q.Push(1); q.Push(9); cout<<q.Front()<<" "<<q.Rear()<<endl; //cout<<<<" "; q.Push(68); cout<<q.Front()<<" "<<q.Rear()<<endl; q.Pop(); cout<<q.Front()<<" "<<q.Rear()<<endl; return 0; }