栈--C语言实现数据结构

在这里插入图片描述

本期带大家一起用C语言实现栈🌈🌈🌈

一、栈的概念🌎

栈是一种常见的数据结构,它遵循后进先出(Last In, First Out)的原则。可以将其类比为现实生活中的一摞书或者一叠盘子。

栈由一个连续的内存区域组成,可以存储一系列的元素。在栈的一端称为栈顶,另一端称为栈底。

栈的主要操作包括入栈(Push)和出栈(Pop):

入栈操作将元素放置在栈顶,新增加的元素成为新的栈顶。
出栈操作将栈顶的元素移除,并将其下面的元素成为新的栈顶。
由于栈的特性,只能访问、插入和删除栈顶元素,不支持在任意位置进行操作。

栈具有局部性原理,即后进入栈的元素会先被访问到,而先进入栈的元素则需要等待后面的元素出栈才能被访问到。

栈常用于函数调用、递归算法、表达式求值、括号匹配等场景。

二、栈的操作流程

在这里插入图片描述

三、栈的结构

栈的话,我们可以使用顺序栈链表栈来实现

1.对于顺序栈而言:
方便的便是尾删和尾插了,因为有记录了下标,那么便可以很快的访问到最后一个元素 ,不需要经过遍历
在这里插入图片描述
2.对于链表栈而言:
对于链表而言,尤其是 单链表,尾部的插入删除是很麻烦的。但是 单链表 的头插和头删就很方便,所以可以把 单链表的头部 作为栈顶,单链表的尾部 作为 栈底。 插入数据的时候我们需要选择头插数据
在这里插入图片描述

如果对于双向链表而言,那么就是随便选了,毕竟双向链表无论哪头插入删除数据都很方便

那么对于 顺序栈链式栈 ,那个更加好呢?那必定是 顺序栈,因为使用顺序栈的 尾插尾删非常方便, 且 cpu缓存利用率也更高。而且对于顺序栈实现起来相对简单,所以我们接下来就实现 顺序栈

四、栈的实现

4.1 结构设计

typedef int STDataType;typedef struct Stack
{STDataType* a;int top;     //栈顶元素的下一个  或者 栈顶的下标int capacity;
}ST;

这里的 top 我们需要好好理解一下。当top的初始值不同时,top可以表示 栈顶的下一个位置的下标 或 栈顶下标

1.当 top = 0,top 表示栈顶的下一个位置的下标:
在这里插入图片描述

top一开始等于0的时候,先压栈,top再++

2、当top=-1的时候,top 表示栈顶元素的下标:

在这里插入图片描述

top=-1的时候,++top,再压栈

4.2 初始化栈

因为我们实现的是顺序栈,因此和顺序表的初始化是一样的
我们创建一个ST s,然后传s的地址即可

void STInit(ST* ps)
{assert(ps);ps->a = NULL;ps->capacity = 0;ps->top = 0;}

这里我们将top置为0,表示下一个数据的下标

4.3压栈

压栈的话,我们需要判断一下我们的我们的容量capacity是否和我们的ttop相等
如果相等的话,那么就扩容操作

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, newcapacity*sizeof(STDataType));if (tmp == NULL){perror("realloc :fail");return;}ps->a = tmp;ps->capacity = newcapacity;}ps->a[ps->top++] = x;}

在这里插入图片描述

4.4 出栈

出栈的话是很简单的,只需要将我们的top--就可以了
不过需要注意的是,如果我们的栈为空的话,那我们就不进行出栈操作

void STPop(ST* ps)
{assert(ps);assert(!STEmpty(ps));ps->top--;
}

在这里插入图片描述

4.5 获取栈顶元素

获取栈顶元素的话,我们同样需要判断栈是否为空
如果为空的话,那我们就不去获取栈顶元素的操作
如果不为空,那我们返回下标为top-1那个元素

STDataType STTop(ST* ps)
{assert(ps);return ps->a[ps->top - 1];}

4.6 栈中数据的个数

栈中数据个数的话比较简单,只需要返回我们的top即可

int STSize(ST* ps)
{assert(ps);return  ps->top;}

4.7 判断栈是否为空

判断栈是否为空的话,我们只需要返回top==0的真假就行

bool STEmpty(ST* ps)
{return ps->top == 0;
}

4.8 栈的销毁

对于栈的销毁,那么我们就只需要释放动态开辟的空间,将指针置空。并将 capacity 和 top 两个变量置 0即可

void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->capacity = 0;ps->top = 0;
}

5、有效的括号

链接:有效的括号
在这里插入图片描述
看完题目之后,我们可以有以下的思路
我们可以让左括号压栈
当我们遇到右括号的时候,如果我们的栈不为空的话,我们就拿栈顶的元素去和右括号比较,如果括号不匹配的话,我们先销毁一下我们的栈,然后再去返回false
如果我们的栈为空的话,那我们就先销毁一下我们的栈,然后直接返回false
当然当我们的括号匹配的时候,我们就让s➕➕和删去栈顶元素,然后再去进行下一轮的判断
当我们的括号全部匹配完了之后,如果我们的栈不为空的话,我们就返回false,不然就反回true,并且销毁栈

在这里插入图片描述

在这里插入图片描述
易错点:
遍历结束,栈不为空
在这里插入图片描述

6. 感谢与交流✅

🌹🌹🌹如果大家通过本篇博客收获了,对顺序表有了新的了解的话
那么希望支持一下哦如果还有不明白的,疑惑的话,或者什么比较好的建议的话,可以发到评论区,
我们一起解决,共同进步 ❗️❗️❗️
最后谢谢大家❗️❗️❗️💯💯💯

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/27944.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF 自定义控件完成库容表盘显示效果

先看一下显示效果: 需要注意的地方有以下几点: 表盘的刻度分部,长刻度和短刻度显示。在数值80W时,需要更改刻度盘的颜色渐变。在数值80W时,更改库容总数背景的显示,也是颜色渐变。刻度盘控件属性定义&…

二、DDL-5.小结

一、数据库操作 1、查询 查询所有数据库 show databases; 查询目前所处数据库 select database(); 2、进入 进入某个数据库 use itcast; USE 数据库名; 3、创建 创建数据库 create database itcast; create database [if not exists] itcast; create database [if not …

多用户商城系统Dokan评测优点与缺点(2023)

目录 多用户商城系统Dokan优点 多用户商城系统Dokan缺点 您应该开始使用多供应商市场吗? 多用户商城系统Dokan评论 为什么选择Dokan? 用户界面 用户友好的前端 仪表板和后端 管理员后台 供应商仪表板 第三方兼容性 Dokan 可以卖什么&…

全志F1C200S嵌入式驱动开发(spi-nand驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 和v3s一样,f1c200s也支持tf卡、spi-nor、spi-nand启动。前面也说过,tf卡由于机械结构的原因,更适合拿来学习,spi-nor和spi-nand比较适合用来进行工业部署和消费娱乐领域。只是s…

数据库应用:MySQL高级语句

目录 一、理论 1.常用查询 2.函数 3.进阶查询 二、实验 1.普通查询 2.函数 3.进阶查询 三、问题 1.MySQL || 运算符不生效 四、总结 一、理论 1.常用查询 常用查询包括:增、删、改、查; 对 MySQL 数据库的查询,除了基本的查询外…

如何有效检测、识别和管理 Terraform 配置漂移?

作者|Krishnadutt Panchagnula 翻译|Seal软件 链接|https://betterprogramming.pub/detecting-identifying-and-managing-terraform-state-drift-997366a74537 在理想的 IaC 世界中,我们所有的基础设施实现和更新都是通过将更新的…

OpenCv之滤波器

目录 一、卷积 二、方盒滤波与均值滤波 三、高斯滤波 四、中值滤波 五、双边滤波 一、卷积 图像卷积就是卷积核在图像上按行华东遍历像素时不断的相乘求和的过程 相关知识点: 步长:就是卷积核在图像上移动的步幅.(为充分扫描图片,步长一般为1)padding:指在图片…

【C语言进阶(九)】常见内存错误以及柔性数组

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C语言学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多C语言知识   🔝🔝 常见内存错误 1. 前言2. 对NULL指针…

【C++】list的使用

今天我们来进入到C另一个容器list的学习 目录 一、list的介绍 二、list的使用 2.1 构造函数 2.2 迭代器函数接口 2.3 容量函数接口 2.4 元素访问函数接口 2.5 常用修改函数接口 2.6 常用操作函数接口 一、list的介绍 文档介绍:list - C Reference (cpluspl…

html+JavaScript实现一个好看的颜色码查询器,支持查询、转换、颜色选择器和颜色码对照表

前言 相信大家平时工作的时候应该会经常用到颜色码吧,比如说想找个好看的颜色,或者有个颜色码但是不知道这个码是什么颜色的,这个时候我们就可以用颜色码对照表或者颜色码查询来查看了。 当然也可以用截图软件或者取色器或者PS来查看&#…

安卓设备监听全部输入信号

前言: 最近团队收到一个产品需求,需要监听安卓设备上用户是否有输入行为,以免定制推荐的时候打搅到用户。这里指的是设备上所有应用的输入行为,而不是单指某一个应用。 这个需求还是蛮有挑战性的,需要涉及到很多FW层…

vue新增删除内容排序问题解决处理

本次答题选项的删除添加是个人最初比较头疼的地方。比如ABCD四个选项,删除c选项后,点击【新增答题类型】选项按钮,则默认创建是E选项。再或者就是ABCD四个选项位置删除任意一个后,顺序被打乱等,最后解决了,…