#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
//链栈储存结构
typedef struct StackNode
{
ElemType data;
struct StackNode *next; //指向下一个同类型结点
}StackNode,*LinkStack;
//初始化
Status InitStack(LinkStack *S)
{
*S = NULL; //头指针置空
return OK;
}
//入栈
Status push(LinkStack *S,ElemType e)
{
StackNode *p; //开辟新结点
p = (StackNode *)malloc(sizeof(StackNode));
p->data = e; //元素赋值
p->next = *S; //压栈(结点连接)
*S = p; //头指针指向栈顶(指向新结点)
return OK;
}
//出栈
Status pop(LinkStack *S,ElemType *e)
{
if(*S == NULL) return ERROR; //空栈
StackNode *p; //临时指针
*e = (*S)->data; //数据出栈
p = *S; //临时指针
*S = (*S)->next; //栈顶指针指向上一个元素
free(p); //释放临时指针指向的栈顶空间
return OK;
}
//判断链栈是否为空
int isEmpty(LinkStack S)
{
if(S == NULL) return TRUE; //指向栈顶的指针为空
return FALSE;
}
//遍历
void showElems(LinkStack S)
{ LinkStack p;
p=S;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
}
//清空链栈
Status clearStack(LinkStack *S)
{
if(*S == NULL) return ERROR;
ElemType e;
while(*S != NULL)
pop(S,&e);
free(&e);
return OK;
}
//取栈顶元素
int GetTop(LinkStack S){
if(S!=NULL)
S->data;
return OK;
}
int main()
{ int i,n,e;
LinkStack S;
printf("已初始化链栈\n");
InitStack(&S);
printf("入栈n个元素,输入n:") ;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&e);
push(&S,e);
}
printf("\n链栈是否为空?\n");
printf("当前链栈情况:");
if(isEmpty(S)) printf("空栈\n");
else printf("非空栈\n");
printf("\n遍历栈内元素\n");
showElems(S);
printf("\n");
//栈顶元素
printf("取栈顶元素:");
// if(GetTop(S)){
//printf("%d\n",e);
//}
GetTop(S);
printf("%d",e);
printf("\n\n清空链栈\n");
clearStack(&S);
printf("当前链栈情况:");
if(isEmpty(S)) printf("空栈\n");
else printf("非空栈\n");
}