//队列工具
template <class DT>
struct SqQueue											// 顺序队类
{
	BTNode<DT>*  *base;									// 队列首址
	int front;											// 队头指针
	int rear;											// 队尾指针
	int queuesize;										// 队容量
};

//【算法3.14】											初始化队列
template <class DT>
void InitQueue(SqQueue<DT> &Q, int m)
{
	Q.base=new BTNode<DT>*[m];							// 申请队列空间
    if(Q.base==NULL)									// 申请空间失败
	{
		cout<<"未创建成功！";
		exit (1);										// 退出
	}
	Q.front=Q.rear=0;									// 设置队列属性 
	Q.queuesize=m;										
}


//算法3.15】											销毁列列
template <class DT>
void DestroyQueue(SqQueue<DT> &Q)	
{
	delete [] Q.base;									// 释放队列空间
	Q.front=Q.rear=0;									// 设置队列属性
	Q.queuesize=0;
}


//【算法3.16】											入队
template<class DT>
bool EnQueue(SqQueue<DT> &Q,BTNode<DT>* e)
{
	if((Q.rear+1)%Q.queuesize==Q.front)					// 队满
        return false;									// 返回false
    Q.base[Q.rear]=e;									// 出队
    Q.rear=(Q.rear+1)% Q.queuesize;						// 修改队列属性
	return true;										// 返回true
}

//【算法3.17】											出队
template<class DT>
bool DeQueue(SqQueue<DT> &Q,BTNode<DT>* &e)
{
	if(Q.front==Q.rear)									// 队空
        return false;
	e=Q.base[Q.front];
	Q.front=(Q.front+1)%Q.queuesize;
	return true;										// 删除成功，返回true
}

														// 测队空
template<class DT>
bool QueueEmpty(SqQueue<DT> Q)
{
	if(Q.front==Q.rear)									// 队空
		return true;									// 返回true
	else												// 队不空
		return false;									// 返回false
}