链栈的实现
2012-10-16 10:13
239 查看
#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;
}
#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;
}