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

深度解剖数据在栈中的应用

> 作者简介:დ旧言~,目前大一,现在学习Java,c,c++,Python等
> 座右铭:松树千年终是朽,槿花一日自为荣。
> 望小伙伴们点赞👍收藏✨加关注哟💕💕 

 🌟前言       

        前面我们已经学习了顺序表和链表,他们无法控制数据的打印,而栈一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。今天我们来实现一下--《栈》。

🌙主体

这里我们这里需知道栈的简单知识

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。

咱们从两个方面实现栈,动态管理,对元素进行操作。

在程序中为了实现栈,需要创建头文件Stactt.h ,创建源文件Test.c,Stack.c。

 🌠动态管理

💤初始化动态栈

💦1.因为咱们的栈是以数组的形式存储则需要开辟空间

💦2.定义一个数组指针来存储数据

💦3.定义栈顶

1.首先我们在Stact.h定义动态的栈,省得我们再调用(栈),这里和顺序表是一样哒。

//定义数据类型
typedef int STDataType;//定义栈
typedef struct Stack
{//定义数组STDataType* a;//栈顶int top;//初始容量int capacity;
}ST;

2.对栈进行初始化

实现这个函数那简直就是信手拈来,不会的打手手

//初始化
void STInit(ST* ps)
{//断言assert(ps);//初始化ps->a = NULL;ps->capacity = 0;ps->top = 0;
}

 💤释放栈内存

实现这个函数只需要释放ps->a内存,其它值为零

//销毁
void STDestroy(ST* ps)
{//断言assert(ps);//释放内存free(ps->a);//置空ps->a = NULL;ps->top = ps->capacity = 0;
}

  🌠对元素进行操作

 💤添加元素

💦1.当开辟的空间等于栈顶则需要扩容

💦2.因为这里是先进先出所以把元素放在栈顶

💦3.再top++

//添加元素
void STPush(ST* ps, STDataType x)
{//断言assert(ps);//当空间不足时需要开辟空间if (ps->top == ps->capacity){//扩容int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//开辟空间STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity);//判断if (tmp == NULL){perror("realloc fail");exit(-1);}//赋值ps->a = tmp;ps->capacity = newCapacity;}//放元素进栈ps->a[ps->top] = x;ps->top++;
}

 💤释放元素(出栈)

这里遵循先进先出就行。

//释放元素(出栈)
void STPop(ST* ps)
{//断言(栈中不能为空)assert(ps);//栈指针需要大于零assert(ps->top > 0);//元素减一--ps->top;
}

 💤剥离元素

       既然是剥离元素,因此需要返回值,因为以数组的形式存储,所以需要下标ps->top - 1,遵循先进先出。

//剥离元素
STDataType STTop(ST* ps)
{//断言(栈中不能为空)assert(ps);//栈指针需要大于零assert(ps->top > 0);//剥离元素return ps->a[ps->top - 1];
}

 💤计算栈中元素个数

写这个函数我觉得太小学生了。

//计算栈中元素个数
int STSize(ST* ps)
{//断言assert(ps);//返回元素个数return ps->top;
}

🌙代码总结

🌠主函数

//包含文件
#include"Stack.h"void TestStack1()
{//初始化ST st;STInit(&st);STPush(&st, 1);STPush(&st, 2);STPush(&st, 3);STPush(&st, 4);STPush(&st, 5);while (!STEmpty(&st)){printf("%d ", STTop(&st));STPop(&st);}printf("\n");STDestroy(&st);
}int main()
{TestStack1();return 0;
}

🌠Stact.h头文件

//包含头文件
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>//定义数据类型
typedef int STDataType;//定义栈
typedef struct Stack
{//定义数组STDataType* a;//栈顶int top;//初始容量int capacity;
}ST;//初始化
void STInit(ST* ps);
//销毁
void STDestroy(ST* ps);//添加元素
void STPush(ST* ps, STDataType x);
//释放元素(出栈)
void STPop(ST* ps);
//剥离元素
STDataType STTop(ST* ps);
//计算栈中元素个数
int STSize(ST* ps);bool STEmpty(ST* ps);

🌠Stack.c源文件

//包含文件
#include"Stack.h"//初始化
void STInit(ST* ps)
{//断言assert(ps);//初始化ps->a = NULL;ps->capacity = 0;ps->top = 0;
}//销毁
void STDestroy(ST* ps)
{//断言assert(ps);//释放内存free(ps->a);//置空ps->a = NULL;ps->top = ps->capacity = 0;
}//添加元素
void STPush(ST* ps, STDataType x)
{//断言assert(ps);//当空间不足时需要开辟空间if (ps->top == ps->capacity){//扩容int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//开辟空间STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity);//判断if (tmp == NULL){perror("realloc fail");exit(-1);}//赋值ps->a = tmp;ps->capacity = newCapacity;}//放元素进栈ps->a[ps->top] = x;ps->top++;
}//释放元素(出栈)
void STPop(ST* ps)
{//断言(栈中不能为空)assert(ps);//栈指针需要大于零assert(ps->top > 0);//元素减一--ps->top;
}//剥离元素
STDataType STTop(ST* ps)
{//断言(栈中不能为空)assert(ps);//栈指针需要大于零assert(ps->top > 0);//剥离元素return ps->a[ps->top - 1];
}//计算栈中元素个数
int STSize(ST* ps)
{//断言assert(ps);//返回元素个数return ps->top;
}//判断栈中是否还有元素
bool STEmpty(ST* ps)
{//断言assert(ps);//返回值return ps->top == 0;
}

🌟结束语

       今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小说手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

相关文章:

深度解剖数据在栈中的应用

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大一&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 望小伙伴们点赞&#x1f44d;收藏✨加关注哟&#x1f495;&#x1…...

Android10 SystemUI系列 需求定制(一)状态栏控制中心默认tile定制属性适配

一、前言 SystemUI 所包含的界面和模块比较多,这一节主要分享一下控制中心默认tile 列表的实现,通过配置可以实现 下拉状态栏,控制中心默认的tile显示 二、准备工作 按照惯例先找一下控制中心的代码,主要在下面这个路径下 frameworks/base/packages/SystemUI/src/com/andr…...

【微信小程序】文章设置

设置基本字体样式&#xff1a;行高、首行缩进 font-size: 32rpx;line-height: 1.6em;text-indent: 2em;padding: 20rpx 0;border-bottom: 1px dashed var(--themColor); 两端对齐 text-align: justify; css文字两行或者几行显示省略号 css文字两行或者几行显示省略号_css…...

程序员在线周刊(冒泡算法篇)

大家好&#xff0c;欢迎来到程序员在线周刊&#xff01;本期我们将深入探讨一种经典的排序算法——冒泡算法&#xff0c;并附上具体的代码实现。 目录 简介代码原理广告广告1广告2广告3 简介 冒泡算法是一种简单但效率较低的排序算法&#xff0c;它的原理非常直观&#xff1a…...

string

目录 六、STL简介 (一)什么是STL (二)STL的版本 (三)STL六大组件 七、string (一)标准库中的string 1、string类 2、string常用的接口 1)string类对象的常见构造 2)string类对象的容量操作 3)string类对象的访问及遍历操作 4)string类对象的修改操作 5)string类非成…...

html的日期选择插件

1.效果 2.文档 https://layui.gitee.io/v2/docs/ 3.引入 官网地址&#xff1a; https://layui.gitee.io/v2/ 引入&#xff08;在官网下载&#xff0c;&#xff09;jquery-1.7.2.min.js,layui/layui.js **<link href"js/layui/css/layui.css" rel"stylesh…...

OPPO哲库事件 “ 始末 ” ! 集体打哑谜?

1►OPPO哲库解散 2019 年&#xff0c;美国商务部以“科技网络安全”为由&#xff0c;将华为公司及其70家附属公司列入出口管制“实体名单”。与此同时&#xff0c;OPPO 创始人兼 CEO陈明永对外宣布&#xff0c;公司将为未来三年内投入 500 亿元用于前沿技术和深水区技术的探索…...

数据聚类分析

K均值 1.1 数据来源(随机生成) import matplotlib.pyplot as plt from sklearn.datasets import make_blobsX, y make_blobs(n_samples150,n_features2,centers3,cluster_std0.5,shuffleTrue,random_state0) # plt.scatter(X[:, 0], X[:, 1], cwhite, markero, edgecolorsbl…...

前 40 个 Microsoft Excel 面试问题答案

1&#xff09;什么是 Microsoft Excel&#xff1f; Microsoft Excel 是一个电子电子表格应用程序&#xff0c;使用户可以使用按行和列细分的电子表格系统&#xff0c;使用公式存储&#xff0c;组织&#xff0c;计算和处理数据。 它还提供了使用外部数据库进行分析&#xff0c;…...

ros2学习笔记:shell环境变量脚本setup.bash[-z][-n][-f]参数作用

-n作用 [ -n 字符串 ] or [ 字符串 ] 字符串的长度为非零&#xff08;有内容&#xff09;则为真。加-n与不加-n结果相同。 -z作用 [ -z 字符串 ] 字符串的长度为零则为真。 字符串为空即NULL时为真&#xff0c;与上面的-n相反。 -f作用 [ -f FILE ] 如果 FILE 存在且是一…...

xss渗透(跨站脚本攻击)

一、什么是XSS? XSS全称是Cross Site Scripting即跨站脚本&#xff0c;当目标网站目标用户浏览器渲染HTML文档的过程中&#xff0c;出现了不被预期的脚本指令并执行时&#xff0c;XSS就发生了。 这里我们主要注意四点&#xff1a; 1、目标网站目标用户&#xff1b; 2、浏览…...

9参数化重采样时频变换,基于MATLAB平台,程序已调通,可直接替换数据进行分析。

参数化重采样时频变换&#xff0c;基于MATLAB平台&#xff0c;程序已调通&#xff0c;可直接替换数据进行分析。 9matlab参数化重采样时频变换 (xiaohongshu.com)...

RK3568平台开发系列讲解(调试篇)系统运行相关频率设置

🚀返回专栏总目录 文章目录 一、CPU 频率设置二、DDR 频率设置三、NPU 频率设置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 CPU 默认是 interactive 状态,它会根据 CPU 使用率和目标负载来动态地调整 CPU 频率。为获得更高运行速度或者性能评估,我们需要手动固…...

嵌入式:驱动开发 Day2

作业&#xff1a;字符设备驱动&#xff0c;完成三盏LED灯的控制 驱动代码&#xff1a; mychrdev.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include &q…...

RK3399平台开发系列讲解(入门篇)VIM的基础命令

🚀返回专栏总目录 文章目录 一、Vim 命令速查二、其他命令三、Vim模式沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将介绍Vim相关命令。 一、Vim 命令速查 简单说明一下,这张图上展示了一个键盘。图中的“•”表示,单个字母不是完整的命令,必须再有进一步…...

Rocky Linux 安装图解(替代centos)服务器+桌面

centos自从20年底转变为不稳定版本后&#xff0c;有很多替代方案 经过近3年的发展&#xff0c;rocky linux算是一个比较好的选择&#xff0c;一是依照red hat企业版来做&#xff0c;二是rocky的发起者也是centos的创始人 如果想安装debian&#xff0c;可以参考&#xff1a;deb…...

webpack 基础配置

常见配置 文件打包的出口和入口webpack如何开启一台服务webpack 如何打包图片&#xff0c;静态资源等。webpack 配置 loader配置 plugin配置sourceMap配置 babel 语法降级等 接下来 &#xff0c; 我们先从webpack的基本配置 开始吧&#xff01; 在准备 配置之前 , 搭建一个 …...

C语言和mfc按格式读取文件数据

fscanf()函数的功能是从文件中按格式读取一个或多个数据&#xff1b; 例如文件中有一行数据&#xff0c; 22 3.34 hello 则使用 fscanf(fp, "%d%f%s", &a, &f, str) 可一次读取整型、浮点、字符串三个数据&#xff1b; 此函数位于C标准库头文件<stdio…...

SQLyog 各版本下载与安装(目前最新版本为13.2.0)

文章目录 一、SQLyog Ultimate 各版本下载1. For Windows x642. For Windows x86 二、SQLyog Community 各版本下载1. For Windows x642. For Windows x863. For Linux x86_644. For Linux i386 三 、SQLyog 安装四、如何解决SQLyog试用期到期问题五、最后 数据库可视化工具&am…...

CopyOnWrite 容器

CopyOnWrite容器是Java并发包中提供的一种特殊类型的集合,它的特点是在进行修改操作时不会修改原始容器,而是创建一个新的容器副本进行修改,这样可以避免并发修改异常(ConcurrentModificationException)。 主要的CopyOnWrite容器包括: CopyOnWriteArrayList:这是一个基…...

“Minwa不是滤镜,是语法”——20年数字艺术总监拆解其底层视觉语义树:从笔触熵值到文化编码层级的7阶解析模型

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;“Minwa不是滤镜&#xff0c;是语法”——一场视觉范式的认知升维 在传统图像处理语境中&#xff0c;“滤镜”常被理解为对像素的后置修饰层——一种不可逆、非结构化、依赖预设参数的视觉覆盖。Minwa …...

【CTF实战】从黑名单绕过到.htaccess:一次完整的文件上传漏洞利用剖析

1. 从文件上传失败开始的CTF挑战 第一次打开这个CTF靶机时&#xff0c;我遇到了一个让人哭笑不得的情况&#xff1a;上传一个完全正常的图片文件居然失败了。这就像你去餐厅点餐&#xff0c;服务员告诉你"我们这里不卖食物"一样荒谬。但正是这种反直觉的现象&#xf…...

革新Mac软件管理体验:Applite智能图形化工具深度解析

革新Mac软件管理体验&#xff1a;Applite智能图形化工具深度解析 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite 还在为繁琐的命令行安装而烦恼&#xff1f;是否曾因复杂的Hom…...

Ninja构建系统实战:手写BUILD.ninja为你的Python/Go小工具加速

Ninja构建系统实战&#xff1a;手写BUILD.ninja为你的Python/Go小工具加速 在快速迭代的现代开发中&#xff0c;构建流程的效率往往成为瓶颈。当你的Python脚本需要打包成可执行文件&#xff0c;Go模块需要交叉编译&#xff0c;同时还要处理资源文件复制、依赖下载等一系列任务…...

手把手教你:在RT-Thread上用STM32驱动0.96寸OLED显示动态二维码(附完整源码)

基于RT-Thread的STM32动态二维码显示系统开发实战 在智能门锁、工业设备配网等物联网场景中&#xff0c;二维码作为信息载体正发挥着越来越重要的作用。本文将完整呈现如何在RT-Thread操作系统上&#xff0c;通过STM32驱动0.96寸OLED实现动态二维码显示功能。不同于简单的功能演…...

工程师如何驾驭参考设计:从复制到创新的实战指南

1. 参考设计的双刃剑&#xff1a;工程师的“爱恨情仇”在电子工程这个行当里混了十几年&#xff0c;我发现自己对“参考设计”的感情&#xff0c;就像对一位能力超群但性格有点别扭的同事。你离不开他&#xff0c;因为他总能帮你快速搞定最棘手的难题&#xff0c;让你在项目截止…...

2002-2024年 人工智能发展能壮大耐心资本吗

本文基于2002-2024年上市公司数据&#xff0c;借鉴《人工智能发展能壮大耐心资本吗&#xff1f; ——来自国家新一代人工智能创新发展试验区的经验证据》一文中的变量构建与基准回归部分&#xff0c;探讨人工智能发展能否培育壮大耐心资本&#xff0c;含原始数据、处理代码、实…...

iVentoy(增强版PXE服务器

链接&#xff1a;https://pan.quark.cn/s/d2ca56327274iVentoy是一个增强版的PXE服务器。你可以通过网络同时为多台机器启动和安装操作系统。软件的使用非常简单&#xff0c;无需复杂的配置。只需要直接将ISO文件放在指定的位置&#xff0c;然后在启动时&#xff0c;客户机可以…...

Minecraft世界瘦身终极方案:MCA Selector免费工具完整使用指南

Minecraft世界瘦身终极方案&#xff1a;MCA Selector免费工具完整使用指南 【免费下载链接】mcaselector A tool to select chunks from Minecraft worlds for deletion or export. 项目地址: https://gitcode.com/gh_mirrors/mc/mcaselector 你是否曾为Minecraft世界日…...

从CuteCom到minicom:手把手教你搭建Ubuntu嵌入式开发串口调试环境(附I.MX6ULL实战)

从CuteCom到minicom&#xff1a;Ubuntu嵌入式开发串口调试全攻略 嵌入式开发中&#xff0c;串口调试如同工程师的"听诊器"。当你在Ubuntu系统上面对I.MX6ULL这类开发板时&#xff0c;选择一款趁手的串口工具&#xff0c;往往能事半功倍。本文将带你深度对比CuteCom和…...