相对于顺序栈的空间有限,链式栈的操作则更加灵活
#include<stdio.h> #include<malloc.h> typedef int SElemType; //元素类型 typedef int Status; //返回值类型 #define OK 1 //操作成功 #define ERROR 0 //操作失败 typedef struct StackNode //链栈结点结构体 { SElemType date; //节点数据 struct StackNode *next; //节点指针 }*LinkStackPtr; //结点名 typedef struct LinkStack //链栈结构体 { LinkStackPtr top; //栈顶指针 int count; //栈结点数量 }LinkStack; //栈名 /*链栈的入栈操作*/ Status Push(LinkStack *S, SElemType e) { LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode)); //申请新结点 s->date = e; //新结点的数据等于e s->next = S->top; //新结点的下一结点等于现在的栈顶结点 S->top = s; //栈顶结点等于新结点 S->count++; //栈中数据加1 return OK; } /*链栈的出栈操作*/ Status Pop(LinkStack *S, SElemType *e) { if(S->count == 0) //判断栈是否为空 return ERROR; LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode)); //申请新结点 s = S->top; //新结点等于当前栈顶结点 *e = s->date; //e等于栈顶结点的数据 S->top = s->next; //栈顶等于新结点的下一结点 free(s); //释放新结点 S->count--; //栈中数据减1 return OK; } void main() { LinkStack S; //创建栈L S.count = 0; //栈顶指针为-1,栈为空 int e; //入栈与出栈的元素 while(true) { printf("请选择对链栈的操作: "); printf("1.入栈 "); printf("2.出栈 "); printf("3.退出 "); int a; scanf("%d", &a); switch(a) { case 1: printf("请输入入栈的元素:"); scanf("%d", &e); if(Push(&S, e)) printf("入栈成功 "); else printf("入栈失败 "); break; case 2: if(Pop(&S, &e)) printf("出栈的元素为:%d ",e); else printf("栈空 "); break; case 3: return; default: printf("选择错误 "); break; } } }