当前位置: 首页 > news >正文

用顺序表实现栈的基本操作

栈的操作包括初始化栈,入栈,出栈,判空,销毁栈,获取栈的长度,获取栈顶元素。

在C语言中,首先引用头文件

#include<stdio.h> #include<stdlib.h> #include<stdbool.h>

接下来是栈的结构体定义

typedef struct Stack{ int *data; int top; int init_capacity;}Stack;

data指针指向第一个元素的位置,top指的是栈顶元素的下标,init_capacity指的是栈的容量。

初始化栈

Stack *create_stack(int init_capacity){ Stack *stack=(Stack *)malloc(sizeof(Stack)); if(!stack){ printf("malloc fail"); exit(1);} stack->data=(int *)malloc(init_capacity*sizeof(int)); if(!stack->data){ printf("malloc fail"); exit(1);} stack->init_capacity=init_capacity; stack->top=-1; return stack;}

判空

bool is_empty(Stack *stack){ return !stack||stack->top==-1;}

获取栈中元素的个数

int size(Stack *stack){ return !stack?0:stack->top+1;

获取栈顶元素(不出栈)

bool peek(Stack *stack, int *val){ if(!stack || is_empty(stack)){ printf("错误:栈为空或指针无效\n"); return false; // 返回false,程序不终止 } *val = stack->data[stack->top]; return true; // 返回true表示成功 }

入栈

void push(Stack *stack,int value){ if(!stack){ return;} if (stack->top == stack->init_capacity - 1) { stack->init_capacity *= 2; stack->data = (int*)realloc(stack->data, stack->init_capacity * sizeof(int)); if (!stack->data) { perror("realloc failed"); exit(EXIT_FAILURE);}} stack->data[++stack->top]=value;}

入栈操作时,如果栈满的话,可以直接返回,也可以在代码中重新申请空间扩容。

出栈

int pop(Stack *stack){ if(!stack||is_empty(stack)){ exit(1);} return stack->data[stack->top--];}

销毁栈

void destroy_stack(Stack *stack){ if(stack){ free(stack->data); free(stack);}}

exit()与return

特性returnexit()
作用对象仅作用于当前函数作用于整个程序
执行结果返回到函数调用处,程序继续执行直接终止整个程序,退出到操作系统
清理行为仅清理当前函数的局部变量会执行注册的清理函数(如atexit)、刷新缓冲区、关闭文件描述符等
返回值意义返回给调用者(可以是任意类型)返回给操作系统(0 = 成功,非 0 = 失败)
头文件无需额外头文件需要#include <stdlib.h>
http://www.cnnetsun.cn/news/1430404.html

相关文章:

  • 团队协作神器:draw.io流程图实时共享与版本控制全攻略
  • 保姆级教程:在SAP里创建一个能直接下载文件的HTTP接口(SICF配置避坑指南)
  • 卷积神经网络在实时语音降噪中的实践:以FRCRN为例
  • Windows下OpenClaw安装避坑:ollama-QwQ-32B联调全记录
  • 5个效率倍增技巧:用BilibiliDown解决B站视频下载的3大痛点
  • Element-UI上传组件进阶玩法:自动添加动态水印并直传OSS(避坑指南)
  • SEO_内容营销中融入SEO的关键方法与案例
  • [数学]幂级数傅里叶级数易错点
  • SEO_如何通过内容优化有效提升SEO效果?(263 )
  • MMDetection配置文件继承机制深度避坑指南:从`_base_`到`_delete_`的正确使用姿势
  • Python三维核密度图实战:从数据生成到可视化分析
  • 告别漫长等待:PyTorch高效加载本地CIFAR10/100数据集的工程实践
  • G-Helper完全指南:3个步骤告别华硕笔记本臃肿控制软件
  • 基于顺序表实现通讯录
  • 第30次CSP第二题——矩阵运算
  • Nanbeige 4.1-3B Streamlit WebUI一文详解:CSS :has()伪类实现气泡智能对齐
  • RexUniNLU效果展示:中文体育新闻中‘比赛’事件+对阵双方+比分+时间抽取
  • obs studio使用
  • 【无线通信】占用带宽(OBW)的测量与优化实战指南
  • 再论数集相等概念凸显初等数学有几百年重大错误:将无穷多前所未知的伪x轴误为x轴
  • 基于国密 SM3/SM4/SM2 的前后端数据完整性校验实战(附完整代码)
  • 【2026年最新600套毕设项目分享】springboot健康菜谱生成系统(14221)
  • 安卓手机网络共享给MacBook (M1芯片)
  • 3个智能交易技巧:Steam-Economy-Enhancer让库存管理效率提升87%
  • Qwen3-ASR-1.7B在医疗场景的应用:电子病历语音录入系统
  • 我也没想到,Java开发 API接口可以不用写 Controller了
  • 数值特征工程中的四种缩放方法:原理、适用场景与局限性
  • HereSphere VR播放器下载地址与使用教程(Meta Quest 2/3可用)Meta Quest播放器、HereSphere下载、VR视频播放器推荐、Quest 3看片工具、VR本地播放器、
  • 【收藏】500+ AI工具导航,这一站搞定你的AI工具箱!
  • FireRedASR-AED-L代码实例:Python调用FireRedASR-AED-L模型核心接口