#define STACKINCREMENT 10
//*****************************************************************************************************
typedef struct //定義順序棧的結構
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S){ //創建新的棧
S.base=(SElemType *)malloc((STACK_INIT_SIZE)*sizeof(SElemType));
if(!S.base)
exit(OVERFLOW);
S.top=S.base; //棧空標記
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status DestoryStack(SqStack &S){ //銷燬棧
if(S.base)
free(S.base);
S.base=NULL;
return OK;
}
Status ClearStack(SqStack &S){ //清空棧
S.base=S.top;
return OK;
}
Status StackEmpty(SqStack &S){ //棧的判空
return (S.base==S.top);
}
Status GetTop(SqStack &S,SElemType &e){ //返回棧頂元素
if(S.top==S.base)
return ERROR;
e=*(S.top-1);
return OK;
}
Status Push(SqStack &S,SElemType e){ //入棧(插入e作爲棧頂元素)
if(S.top-S.base>=S.stacksize)
{
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)
exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
Status Pop(SqStack &S,SElemType &e){ //出棧(刪除棧頂元素,用e返回元素值)
if(S.top==S.base)
return ERROR;
e=*--S.top;
return OK;
}
Status StackTraverse(SqStack &S){ //遍歷順序棧
SElemType *p;
p=S.top;
while(p>S.base){
p--;
cout<<*p;
}
return OK;
}
ElemType StackLength(SqStack S) //求棧長
{
return S.top-S.base;
}//StackLength