1. 程式人生 > >佇列(queue)的模板類及其成員函式的實現

佇列(queue)的模板類及其成員函式的實現

佇列(queue)是先進先出的資料結構,儲存方式可以是陣列也可以是連結串列。如果用陣列儲存,一般採用迴圈佇列的方式。

所以需記住幾個關鍵點:

隊頭指標進1:front = (front+1)%maxsize

隊尾指標進1:rear = (rear+1)%maxsize

判斷隊空:front = rear

判斷隊滿:front = (rear+1)%maxsize,這裡,隊滿的時候隊尾和隊頭之間空有一個元素,以此來避免和front=rear混淆

定義標頭檔案

/*佇列用陣列儲存的一般用迴圈佇列
  front = (front+1)%maxsize
  rear = (rear+1)%maxsize
  隊頭指向儲存的第一個元素,而隊尾指向的是儲存的最後一個元素的下一個位置
  所以,在佇列滿的時候,隊頭和隊尾之間是空有一個元素的,否則當front==rear時,
  會混淆滿隊和空隊
  空隊:front == rear
  滿隊:(rear+1)%maxsize ==front
*/

#include <assert.h>
#include<iostream>
using namespace std;

template<class T>
class SeqQueue{
public:
	SeqQueue(int sz=50);
	~SeqQueue();
	bool EnQueue(const T& x);
	bool DeQueue();
	T getFront(); //獲取隊頭元素
	bool makeEmpty(){front = rear =0; return true;}
	bool isEmpty()const{return (front==rear)?true:false;}
	bool isFull()const{return ((rear+1)%maxsize==front)?true:false;}
	int getsize()const{return (rear-front+maxsize)%maxsize;}  //獲取佇列元素個數
private:
	int front,rear;
	T* element;
	int maxsize;
};

成員函式的實現
#include "queue.h"

template<class T>
SeqQueue<T>::SeqQueue(int sz):maxsize(sz):front(0):rear(0){
	element = new T[maxsize];
	assert(element!=NULL);
}

template<class T>
bool SeqQueue<T>::EnQueue(const T& x){
	if(isFull()==true)return false;
	element[rear]=x;
	rear = (rear+1)%maxsize;
	return true;
}

template<class T>
bool SeqQueue<T>::DeQueue(){
	if(isEmpty()==true)return false;
	T x = element[front];
	front = (front+1)%maxsize;
	delete x;
	return true;
}

template<class T>
T SeqQueue<T>::getFront(){
	if(isEmpty()==true)return -1;
	return element[front];
}