该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include /* malloc()等 */
#include
#include
#include /* exit() */
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
typedef int SELemType;
typedef int Status; /* 定义栈顶元素类型,此句要在c3-1.h的前面 */
typedef struct Node
{
SELemType data;
struct Node *next;
}Node,*LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
int count;/*记录链栈的元素个数*/
}LinkStack; /* 链栈 */
/* 链栈的基本操作(9个) */
Status InitStack(LinkStack *S)
{ /* 构造一个空栈S */
LinkStackPtr p;
p=(LinkStackPtr)malloc(sizeof( Node));
if(!p)
exit(OVERFLOW); /* 存储分配失败 */
p->next=NULL;
S->top=p;
S->count=0;
return OK;
}
Status ClearStack(LinkStack *S)/*清空链栈*/
{
LinkStackPtr p;
while(S->top)
{
p=S->top;
S->top=S->top->next;
S->count--;
free(p);
}
return OK;
}
Status DestroyStack(LinkStack *S)
{ /* 销毁栈S,S不再存在 */
ClearStack(&*S);
free(S);
return OK;
}
Status StackEmpty(LinkStack S)
{ /* 若栈S为空栈,则返回TRUE,否则返回FALSE */
if(S.top)
return TRUE;
else
return FALSE;
}
int StackLength(LinkStack S)
{ /* 返回S的元素个数,即栈的长度 */
return S.count;
}
Status GetTop(LinkStack S,SELemType*e)
{ /* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */
if(!S.top) return ERROR;
*e=S.top->data;
return OK;
}
Status Push(LinkStack *S,SELemType e)
{ /* 插入元素e为新的栈顶元素 */
LinkStackPtr p=(LinkStackPtr)malloc(sizeof(Node));
p->data=e;
p->next=S->top;
S->top=p;
S->count++;
return OK;
}
Status Pop(LinkStack *S,SELemType *e)
{ /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
LinkStackPtr p;
if(!S->top) return ERROR;
p=S->top;
S->top=S->top->next;
S->count--;
free(p);
return OK;
}
Status visit(SELemType a)
{
printf("%d",a);
return OK;
}
Status StackTraverse(LinkStack S)
{ /* 从栈底到栈顶依次对栈中每个元素调用函error C2081: 'SElemType' : name in formal parameter list illegal数visit() */
LinkStackPtr p;
p=S.top;
while(p)
{
visit(p->data);
p=p->next;
}
printf("\n");
return OK;
}
int main()
{ int i;
SELemType e;
LinkStack s;
if(InitStack(&s))
for(i=1;i<=10;i++)
Push(&s,i);
printf("压栈操作后,栈中元素为:\n");
StackTraverse(s);
Pop(&s,&e);
printf("出栈操作后,弹出的元素为:%d\n",e);
Pop(&s,&e);
printf("再次出栈操作后,弹出的元素为:%d\n",e);
printf("Push将刚刚弹出的元素%d再次压入栈中\n");
Push(&s,e);
printf("StackEmpty判断栈是否为空:%d(1:是 0:不是)\n",StackEmpty(s));
GetTop(s,&e);
printf("GetTop当前的栈顶元素为:%d\n",e);
printf("StackLength:当前的栈的长度为:%d\n",StackLength(s));
ClearStack(&s);
printf("ClearStack栈清空后,StackEmpty栈是否为空:%d(1:是 0:不是)%d",StackEmpty(s));
DestroyStack(&s);
printf("DestroyStack栈销毁");
return 0;
}