//栈
template <class DT>
struct SqStack										// 顺序栈
{
	BTNode<DT>*  *base;								// 栈首址
	int top;										// 栈顶指针
	int stacksize;									// 栈容量
};


//【算法3.1】										初始化栈
template <class DT>
void InitStack(SqStack<DT> &S, int m)
{
	S.base=new BTNode<DT>* [m];						// 申请栈空间
    if(S.base==NULL)
	{
		cout<<"未创建成功！";
		exit (1);
	}
	S.top=-1;										// 空栈
	S.stacksize=m;									// 栈容量为m
}


//算法3.2】											销毁栈
template <class DT>
void DestroyStack(SqStack<DT> &S)//析构函数
{
	delete [] S.base;								//释放栈空间
	S.top=-1;
	S.stacksize=0;
}


//【算法3.3】
template<class DT>
bool Push(SqStack<DT> &S,BTNode<DT>* e)
{
	if(S.top==S.stacksize-1)						// 栈满，不能插入
		return false;
	S.top++;
	S.base[S.top]=e;
	return true;									// 插入成功，返回true
}

//【算法3.4】										出栈
template<class DT>									
bool Pop(SqStack<DT> &S,BTNode<DT>* &e)
{
	if(S.top==-1)									//栈空
        return false;
	e=S.base[S.top];
	S.top--;
	return true;									// 出栈成功，返回true
}

template<class DT>									// 获取栈元素
bool GetTop(SqStack<DT> &S,BTNode<DT>* &e)
{
	if(S.top==-1)									// 栈空，返回false
        return false;
	e=S.base[S.top];								// 取栈元素
	return true;									// 返回true
}


													// 测栈空
template<class DT>
bool StackEmpty(SqStack<DT> S)
{
	if(S.top==-1)									// 栈空，返回true
		return true;
	else											// 栈非空，返回false
		return false;
}