链式栈-C语言实现
相对于顺序栈的空间有限,链式栈的操作则更加灵活
#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("请选择对链栈的操作:\n"); printf("1.入栈\n"); printf("2.出栈\n"); printf("3.退出\n"); int a; scanf("%d", &a); switch(a) { case 1: printf("请输入入栈的元素:"); scanf("%d", &e); if(Push(&S, e)) printf("入栈成功\n"); else printf("入栈失败\n"); break; case 2: if(Pop(&S, &e)) printf("出栈的元素为:%d\n",e); else printf("栈空\n"); break; case 3: return; default: printf("选择错误\n"); break; } } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用