#include
#include
typedef struct
{
int a;
}ElemType;
typedef enum { ERROR, OK } Status;
typedef struct SNode
{
ElemType data;
struct SNode *prior; //prior将指向其前一次入栈的元素
}SNode, *SLink;
Status InitStack( SLink &top ) //构造一个空栈S, top 为栈顶,它唯一地确定一个栈。空栈时为NULL。
{
top = NULL;
return OK;
}//InitStack
int StackEmpty( SLink *top )//判断链栈是否为空
{
return ( top? ERROR : OK );
}
Status Push(SLink &top, ElemType e) //插入元素e为新的栈顶元素
{
SLink p;
p=( SLink ) malloc(sizeof (SNode)); //申请栈元素的结点空间
if(!p) exit ( ERROR );
p->data=e; //为新结点赋值
p->prior=top; //将其插入到原栈顶结点后
top=p; //栈顶指针指向该结点
return OK;
}//Push
Status Pop (SLink &top, ElemType &e)//若栈不空,则用e返回S的栈顶元素值后删除该结点,并返回OK,否则返回ERROR
{
if ( top == NULL)
return ERROR;
SLink p;
p = top;
e = p->data; //返回栈顶元素值
top = top->prior;
free(p); //栈顶指针指向新的栈顶结点,释放被删除结点空间
return OK;
}//Pop
Status GetTop(SLink top, ElemType &e)//若栈不空,则用e返回S的栈顶元素并返回OK,否则返回ERROR
{
if (top == NULL)
return ERROR;
e = top->data; //返回栈顶元素值
return OK;
}//GetTop
Status StackTraverse(SLink top, Status (*visit)(ElemType))//若栈不空,则使用visit函数遍历栈的元素并返回OK,否则返回ERROR
{
if ( top == NULL ) return ERROR;
SLink p;
p=top; //p指向栈顶结点
while(p)
{ //通过循环对栈的元素遍历
visit(p->data);
p=p->prior;
}
return OK;
}//StackTraverse
Status ClearStack( SLink &top )//若栈不空,则通过循环清空栈的元素并返回OK,否则返回ERROR
{
if( top == NULL )
return ERROR;
SLink p;
while( top )
{ //通过循环逐一释放栈元素结点的空间
p = top;
top = top->prior;
free( p );
}
return OK;
}