C语言——栈的实现

news/2024/5/17 13:18:50

栈(Stack)是一种基于先进后出(LIFO)原则的数据结构,类似于我们平常堆放书籍或者盘子的方式。

栈通常是从高地址向低地址增长的,也就是说,栈顶位于较高的内存地址,而栈底位于较低的内存地址。这种结构通常被称为“向下生长的栈”或者“递减栈”。

下面是入栈的示意图,出栈可以理解为是入栈的逆过程。

按照我们现有的知识来看,我们可以用顺序表也可以使用链表,那么对于栈来说,删除和增加尾部元素比较频繁因为是先入先出,并且访问简单,结构简单,所以我们可以考虑使用顺序表(当然也可以使用链表,这里用顺序表举例)。

首先是栈的创建和初始化,销毁函数:

struct Stacklist {char* val;int size;int cap;
};
void StackInit(struct Stacklist* stack){stack->cap = 0;stack->size = 0;stack->val = NULL;
}
void StackDes(struct Stacklist* stack) {free(stack->val);stack->val = NULL;
}

这里的 size 是Stack已有元素的个数,cap 是Stack的容量,val 是储存的字符。这三个函数还是比较容易理解的。

接下来是栈的空间检查和入栈函数(尾插函数,因为是先入后出,后入先出):

void StackCheck(struct Stacklist* stack) {if (stack->cap == stack->size) {if (stack->cap == 0) {stack->cap = 4;stack->val = (char*)malloc(sizeof(char) * stack->cap);}else {stack->val = (char*)realloc(stack->val,sizeof(char)*stack->cap*2);stack->cap = stack->cap * 2;}}
}
void StackPush(struct Stacklist* stack,char a) {StackCheck(stack);(stack->val)[stack->size] = a;stack->size++;
}

在 StackCheck 函数中,如果cap和size都为空,那么就默认创建4个char字符空间给stack->val,
如果cap和size虽然相等但都不为0,那么就默认扩容两倍,stack->val = (char*)realloc(stack->val,sizeof(char)*stack->cap*2);

在StackPush入栈函数中,先检查空间是否足够,然后赋值,size++,

接下来是出栈函数:

char StackPop(struct Stacklist* stack) {stack->size--;return (stack->val)[stack->size];
}

 让size--,返回 char 字符,这里需要注意:前面的代码当压入栈第一个数据时size是1,出栈时是要用size--访问的,所以先自减,再直接返回就是栈顶的值。

最后是Print函数:

void StackPrint(struct Stacklist* stack) {for (stack->size; stack->size>0;) {printf("%c ", StackPop(stack));}
}

这就是文章的全部内容了,感谢阅读,如有错误欢迎指出。


http://www.mrgr.cn/p/03452005

相关文章

响应式动漫音乐/个人博客杂志主题国漫FM模板

国漫FM主题V1.8是以Ajax加以CSS动画的方式,很好的将优雅的设计感和极度精简的代码同时表现了出来,进而缔造出这样一款十分经典的名为Always for you的WordPress博客主题。正如作者自己所言:如果你想让你的WordPress博客看起来个性十足。FM主题为响应式格子布局(瀑布流),是一…

WordPress CVE-2022-4230复现分析

前言 开始CVE审计之旅 WP Statistics WordPress 插件13.2.9之前的版本不会转义参数,这可能允许经过身份验证的用户执行 SQL 注入攻击。默认情况下,具有管理选项功能 (admin+) 的用户可以使用受影响的功能,但是该插件有一个设置允许低权限用户也可以访问它,其实就是没对admi…

Midjourney之绘画背景的选择

hello 小伙伴们,我是你们的老朋友——树下,今天分享Midjourney提示词中绘画背景的选择,话不多说,直接开始~ 对于背景的选择,Midjourney中主要体现在年代和所处的环境对绘画产生不同的影响 科技的发展,我们…

光影看图 v4.5.6.32 绿色版

更新流水:2024.04.30:跟进官方 4.5.6.32 , 第一版 修改内容:by.星罗月兔&DxFans去校验(方案来自@星罗月兔);去更新;去多余组件及无用菜单!下载地址:https://down.neoimaging.cn/neoimaging/NeoViewerSetup_10000_4.5.6.32.exe本文来自博客园,作者:萌面蛋饺,转载请注明…

保存钉钉群直播回放下载:直播回放下载步骤详解

今天,我们就来拨开云雾,揭开保存钉钉群直播回放的神秘面纱。教会你们如何下载钉钉群直播回放 首先用到的工具我全部打包好了,有需要的自己下载一下 钉钉群直播回放工具下载:https://pan.baidu.com/s/1WVMNGoKcTwR_NDpvFP2O2A?p…

js逆向实战之某证信Accept-Enckey参数加密解析

url:https://webapi.cninfo.com.cn/#/marketDataDate 分析过程抓包,主要关注图中标记的数据包,它的回显数据是我们所需要的。但在该数据包的请求中有一个Accept-Enckey参数是经过加密的,需要知道其加密的逻辑。全局搜索sysapi/p_sysapi1007,只有一处符合的。找到对应地方,…

vite vue-cli 读取文件原始内容 使用base64内容的文件

新建文件 img.dataurl 中存放图片base64 <img class=img :src=dataurl alt= /> import dataurl from ./img.dataurl data(){ return { dataurl:dataurl } } vue.config.js module.exports=defineConfig({ configureWebpack:{module:{rules:[{test:/\.dataurl$/,loader…

Linux进程——子进程的创建(fork的原理)

前言&#xff1a;在上一篇文章中&#xff0c;我们已经会使用getpid/getppid函数来查看pid和ppid,本篇文章会介绍第二种查看进程的方法&#xff0c;以及如何创建子进程&#xff01; 本篇主要内容&#xff1a; 查看进程的第二种方法创建子进程系统调用函数fork 在开始前&#xff…

IoTDB 入门教程③——基于Linux系统快速安装启动和上手

文章目录 一、前文二、下载三、解压四、上传五、启动六、执行七、停止八、参考 一、前文 IoTDB入门教程——导读 二、下载 下载二进制可运行程序&#xff1a;https://dlcdn.apache.org/iotdb/1.3.1/apache-iotdb-1.3.1-all-bin.zip 历史版本下载&#xff1a;https://archive.…

基于 Redis 发布订阅实现服务注册与发现

写在前面 其实很少有公司会使用 Redis 来实现服务注册与发现&#xff0c;通常是ETCD、NACOS、ZOOKEEPER等等&#xff0c;但是也不妨碍我们了解。本文会先介绍 Redis 的发布/订阅模式&#xff0c;接着基于这个模式实现服务注册与发现。 Redis发布订阅流程图&#xff1a; Red…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.4--汇编LED驱动程序

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

【MATLAB画图】如何绘制图像坐标系

首先我们需要图像坐标轴的原点在左上角&#xff1a; set(gca,ydir,reverse,xaxislocation,top); 然后我们需要坐标轴上加上箭头 quiver(0, 0, 0, 520); % 在(x1, y1)处绘制一个箭头&#xff0c;其方向和长度由(dx, dy)确定 quiver(0, 0, 700, 0); % 在(x1, y1)处绘制一个箭头…

嵌入式全栈开发学习笔记---C语言笔试复习大全3

目录 笔试题3 笔试题4 笔试题5 上一篇介绍了数据类型的长度和数据范围&#xff0c;并且分别讲解了两个经典的笔试题&#xff0c;这一篇我们再来看三道非常经典的考数据类型长度、数据范围和数据类型转换的笔试题。 说明&#xff1a;我们学过单片机的一般都是有C语言基础的了…

分布式与一致性协议之拜占庭将军问题(三)

拜占庭将军问题 叛将先发送消息 如果是叛将楚先发送作战消息&#xff0c;干扰作战计划&#xff0c;结果会有所不同吗&#xff1f; 在第一轮作战信息协商中&#xff0c;楚向苏秦发送作战指令"进攻",向齐、燕发送作战指令"撤退"&#xff0c;如图所示(当然还…

Seata AT模式学习

官方文档 Seata是目前国内最流行的一个分布式事务的组件,支持以下4种模式 AT模式:对业务代码无侵入,只要在业务的数据库加上一个UNDO_LOG表,在配置文件中配置好Seata的服务端,在需要开启全局事务的地方加上注解就行 TCC模式:即Try-Commit-Cancel,自定义prepare逻辑、com…

免费的单片机物联网MQTT平台选择

目的是多设备接入中控&#xff0c;平台只做转发。 选择巴法云&#xff1a;巴法科技&巴法云-巴法设备云-巴法物联网云平台 clientId是私钥uid&#xff1a; 多设备 clientId 填同一个 uid 都是可以的。平台应该是加了后缀区分。 支持自定义topic&#xff0c;操作简单&#x…

最好用的AI换脸软件,rope下载介绍(支持cpu)

随着AI技术的广泛运用,市面上的换脸软件也多了起来,今天给各位介绍其中的王者Rope! 先上两个动图,给大伙看看效果rope是如何实现这种自然的效果呢?这得益于机器学习技术的不断发展,rope经过深度神经网络的无数次迭代优化,最终得出的模型可以自动学习和识别视频中的人脸特…

Java中的IO流

IO流的概述和分类 IO流分为输入输出流 输入流&#xff1a;读数据 输出流&#xff1a;写数据 流&#xff1a;是一种抽象的概念&#xff0c;是对数据传输的总称&#xff0c;流的本质是数据传输 按照数据类型来分 字节流&#xff1a;字节输入流&#xff0c;字节输出流 字符…

​「Python大数据」词频数据渲染词云图导出HTML

前言 本文主要介绍通过python实现数据聚类、脚本开发、办公自动化。词频数据渲染词云图导出HTML。 一、业务逻辑 读取voc数据采集的数据批处理,使用jieba进行分词,去除停用词词频数据渲染词云图将可视化结果保存到HTML文件中二、具体产出 三、执行脚本 python wordCloud.p…

2024五一杯数学建模A题思路分析-钢板最优切割路径问题

文章目录 1 赛题选题分析 2 解题思路3 最新思路更新 1 赛题 A题 钢板最优切割路径问题 提高钢板下料切割过程中的工作效率&#xff0c;是模具加工企业降低成本和增加经济效益的重要途径&#xff0c;其中钢板切割的路径规划是钢板切割过程的一个关键环节。 钢板切割就是使用特殊…