1 #include <stdio.h> //增+删+取栈顶+初始化+判空+输出 2 #define StackSize 100 3 typedef int DataType; 4 typedef struct{ 5 DataType data[StackSize]; 6 int top; 7 }SeqStack; 8 9 void InitStack(SeqStack * S); 10 void Push(SeqStack *S,DataType x); 11 int Pop(SeqStack * S,DataType * ptr); 12 int GetTop(SeqStack * S,DataType*ptr); 13 int Empty(SeqStack * S); 14 int Print(SeqStack * S); 15 16 int main(){ 17 DataType x; 18 SeqStack S; 19 InitStack(&S); 20 printf("对5和10执行入栈操作:\n"); 21 Push(&S,15); 22 Print(&S); 23 Push(&S,10); 24 Print(&S); 25 if(GetTop(&S,&x)==1) 26 printf("当前栈顶元素为:%d\n",x); 27 if(Pop(&S,&x)==1) 28 printf("执行一次出栈操作,删除元素:%d\n",x); 29 if(GetTop(&S,&x)==1){ 30 printf("当前栈顶元素为:%d\n",x); 31 } 32 printf("请输入待入栈元素:"); 33 scanf("%d",&x); 34 Push(&S,x); 35 if(Empty(&S)==1) 36 printf("栈为空\n"); 37 else 38 printf("栈非空\n"); 39 return 0; 40 } 41 42 void InitStack(SeqStack * S){ 43 S->top=-1; 44 printf("初始化成功!\n"); 45 } 46 void Push(SeqStack * S,DataType x){ 47 if(S->top==StackSize-1){ 48 printf("上溢错误,插入失败\n"); 49 } 50 S->data[++S->top]=x; 51 printf("入栈成功!\n"); 52 } 53 int Pop(SeqStack * S,DataType * ptr){ 54 if(S->top==-1){ 55 printf("下溢错误,删除失败\n"); 56 return 0; 57 } 58 *ptr = S->data[S->top--]; 59 return *ptr; 60 } 61 int GetTop(SeqStack * S,DataType*ptr){ 62 if(S->top==-1){ 63 printf("下溢错误,取栈顶失败\n"); 64 return 0; 65 } 66 *ptr = S->data[S->top]; 67 return 1; 68 } 69 int Empty(SeqStack * S){ 70 if(S->top==-1) 71 return 1; 72 else 73 return 0; 74 } 75 int Print(SeqStack * S){ 76 printf("栈内元素:\n"); 77 for(int i=0;i<=S->top;i++){ 78 printf("%d ",S->data[i]); 79 } 80 printf("\n"); 81 }
1.初始化:
42 void InitStack(SeqStack * S){ 43 S->top=-1; 44 printf("初始化成功!\n"); 45 }
将顺序栈顶Top设为-1
2.入栈:
46 void Push(SeqStack * S,DataType x){ 47 if(S->top==StackSize-1){ 48 printf("上溢错误,插入失败\n"); 49 } 50 S->data[++S->top]=x; 51 printf("入栈成功!\n"); 52 }
(1)判断栈是否已满-----栈顶Top【和数组下标对应】与栈最大长度StackSize是否相等
(2)如果不满足(1),将栈顶Top加一
(3)将待入栈数赋值给Top处的位置
3.出栈:
53 int Pop(SeqStack * S,DataType * ptr){ 54 if(S->top==-1){ 55 printf("下溢错误,删除失败\n"); 56 return 0; 57 } 58 *ptr = S->data[S->top--]; 59 return *ptr; 60 }
(1)判断是否是空栈-----栈顶Top是否等于-1
(2)如果不满足(1),将栈顶Top减一
(3)被删元素通过指针参数ptr返回【由于是利用指针不需要return也会将该值传回给主函数】
Tips:这里要将删除的元素返回,故先赋给*ptr后,栈顶Top加一
4.取栈顶:
61 int GetTop(SeqStack * S,DataType*ptr){ 62 if(S->top==-1){ 63 printf("下溢错误,取栈顶失败\n"); 64 return 0; 65 } 66 *ptr = S->data[S->top]; 67 return 1; 68 }
(1)判断是否是空栈-----栈顶Top是否等于-1
(2)如果不满足(1),利用数组下标,将栈顶值传给*ptr【仅取值,并不修改栈顶位置】
5.判空:
69 int Empty(SeqStack * S){ 70 if(S->top==-1) 71 return 1; 72 else 73 return 0; 74 }
(1)判断是否是空栈-----栈顶Top是否等于-1
(2)依据(1)中判断的情况结果决定return的返回值
6.输出:
75 int Print(SeqStack * S){ 76 printf("栈内元素:\n"); 77 for(int i=0;i<=S->top;i++){ 78 printf("%d ",S->data[i]); 79 } 80 printf("\n"); 81 }
循环输出
****************************************************************
Tips:(1)通常把数组下标为零的一端作为栈底;(2)顺序栈的时间复杂度为 o(1);(3)顺序栈是静态存储分配;(4)由于(3),顺序栈变量退出作用域时,自动释放顺序栈所占存储单元,无需销毁
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现