我們知道,隊列是使用的最常見的資料結構之一。常用的隊列的實現有兩種方法,數組和鏈式結構。下面用數組實現以下queue。
包括的實現函數:
enqueue(T x) 壓入隊列。
getqueue() 擷取隊列元素,但不取出隊列
removequeue() 取出隊列元素
searchqueue(T x) 查詢元素x
empty() 隊列是否為空白
length() 返回隊列長度
使用c++的template 實現。
class 的聲明如下:
const int MAXSIZE = 100;
template < class T > //運用模板類
class queue
{
public:
queue(); //構造一個新的隊列
~queue(); //解構函式
int enqueue( T x ); //x元素入隊
T getqueue(); //擷取隊頭元素,但不取出
T removequeue(); //取出隊頭元素
void searchqueue(); //遍曆隊列中的元素
bool empty(); //判斷隊列是否為空白
int search( T x ); //尋找元素x
int length(); //檢查隊列長度
private:
int front,rear; //隊頭隊尾指標,隊頭指向隊列第一個元素,隊尾指向隊列中最後一個元素
T data[ MAXSIZE ]; //定義存放隊列元素的數組
};
template < class T > inline queue<T> :: queue() //初始化隊列,front 和 rear 均設為0{front = rear = 0;data=new T[MAXSIZE]; count=1;}template < class T > inline queue<T> :: ~queue(){}template < class T > inline void queue<T> :: enqueue( T x ){ int Capacity;if ( rear >= count*MAXSIZE - 1) //判斷隊列是否已滿{ Capacity=(++count)*MAXSIZE; T* temp=new T[Capacity]; for(int i=0;i<Capacity-MAXSIZE;++i) { temp[i]=data[i]; } delete [] data; data=temp; }data[rear] = x;rear = rear + 1;}template < class T > inline T queue<T> :: getqueue(){if ( front == rear ) throw "溢出"; //隊列為空白時拋出“溢出”return data[front];}template < class T > inline T queue<T> :: removequeue(){if ( front == rear )throw "溢出";T result =data[front]; front = front + 1;return result;}template < class T > inline bool queue<T> :: empty() //隊列為空白時傳回值為1,不為空白傳回值為0{if ( front == rear )return true;elsereturn false;}template < class T > inline int queue<T> :: search( T x ) //傳回值為在隊列中尋找到x的次數{int i;int m = 0;for ( i = front; i < rear; ++i) //從第二個元素開始尋找(第一個元素存放的是隊列長度),直到查到隊尾元素為止{if ( x == data[i] )m = m + 1;}return m;}template < class T > inline int queue<T> :: length(){return rear-front; //返回隊首元素}//遍曆隊列template < class T > inline void queue<T> :: searchqueue(){int i;if ( front == rear )std :: cout << "隊列是空的!" << endl; for ( i = front; i < rear; ++i ){std :: cout << data[i] << " ";}std :: cout << endl;}
測試代碼:
void main(){int x;queue <int> a;cout << "向隊中添加元素1" << endl;a.enqueue( 1 );cout << "向隊中添加元素2" << endl;a.enqueue( 2 );cout << "向隊中添加元素3" << endl;a.enqueue( 3 );cout << "向隊中添加元素4" << endl;a.enqueue( 4 );cout << "向隊中添加元素5" << endl;a.enqueue( 5 );cout << "向隊中添加元素6" << endl;a.enqueue( 6 );cout << "顯示此時的隊首元素:" << a.getqueue() << endl;cout << "刪除此時的隊首元素並輸出該元素為:" << a.removequeue() <<endl;cout << "刪除此時的隊首元素並輸出該元素為:" << a.removequeue() <<endl;cout << "顯示此時的隊首元素:" << a.getqueue() << endl; cout << "此時的隊列長度為:" << a.length() << endl;cout << "判斷隊列是否為空白(輸出0為空白,1不為空白):" << a.empty() << endl;cout << "遍曆該隊列,依次輸出各個元素:" << endl;a.searchqueue(); cout << "在隊列中尋找5出現的次數為:" << a.search( 5 ) << endl;}
輸出結果:
採用鏈式結構,原理一致。