C_数据结构(栈) —— 栈的初始化、栈的销毁、入栈、出栈、bool类型判断栈是否为空、取栈顶元素、获取栈中有效元素个数

目录

一、栈

1、概念与结构

二、栈的实现

1、定义栈的结构

2、栈的初始化

3、栈的销毁

4、入栈

5、出栈

6、bool类型判断栈是否为空

7、取栈顶元素

8、获取栈中有效元素个数

三、完整实现栈的三个文件

Stack.h

Stack.c

test.c


一、栈

1、概念与结构

栈:⼀种特殊的线性表,其只允许在固定的⼀端进⾏插⼊和删除元素操作。进行数据插入和删除操作的⼀端称为栈顶,另⼀端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

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

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

重点:栈底层结构选型

        栈的实现⼀般可以使用数组或者链表实现,相对而言数组的结构实现更优⼀些。因为数组在尾上插入数据的代价比较小。

二、栈的实现

1、定义栈的结构

//定义栈的结构
typedef int STDataType;
typedef struct Stack
{STDataType* arr;int capacity;//栈的空间大小int top;
}ST;

思路分析:

        定义栈数组指针变量arr,其类型可以通过typedef来转化,定义整型类型栈的空间大小和top栈顶,最后通过typedef类型转换新命名ST栈的结构体类型。

2、栈的初始化

//栈的初始化
void STInit(ST* ps)
{assert(ps);ps->arr = NULL;ps->capacity = ps->top = 0;
}

思路分析:

        首先assert断言判断ps栈的地址是否为空(NULL),将数组地址置为空(NULL),再将容量capacity和栈顶置为0,即此时栈为空(NULL),栈顶与栈底相等。

栈的初始化时调试窗口:

3、栈的销毁

//栈的销毁
void STDestroy(ST* ps)
{assert(ps);if (ps->arr)free(ps->arr);ps->arr = NULL;ps->top = ps->capacity = 0;
}

思路分析:

(1)首先asset断言判断ps栈的地址是否为空(NULL);

(2)再判断ps->arr数组地址是否为空(NULL),若不为空(NULL),则释放掉ps->arr的栈数组地址,再将数组地址置为空(NULL),再将容量capacity和栈顶置为0,即此时栈为空(NULL),栈顶与栈底相等;

(3)若ps->arr数组地址不为空,则直接重复初始化的操作。

栈的销毁时调试窗口:

4、入栈

//入栈
void StackPush(ST* ps, STDataType x)
{assert(ps);//判断空间是否足够if (ps->capacity == ps->top){int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newCapacity;}//空间足够ps->arr[ps->top++] = x;
}

思路分析:

(1)首先assert断言判断ps栈地址是否为空(NULL);

(2)再判断空间是否足够,若空间足够的情况下直接插入数据,即判断ps->capacity栈容量是否等于栈顶ps->top,若空间不足够就进入if语句;

(3)ps->capacity栈容量若为0,则申请四个空间,若不为0,则增容2倍的ps->capacity栈容量,最后赋给变量newCapcity;

(4)通过realloc增容函数将新申请的空间强制类型转化为STDataType*给栈指针变量tmp;

(5)再判断tmp是否申请空间成功,最后将新申请的空间地址赋值给arr数组指针变量,再使newCapacity赋值给ps->capacity栈容量;

(6)若空间足够,则直接让栈顶++,同时进行赋值操作。

5、出栈

//出栈
void StackPop(ST* ps)
{assert(ps);assert(!StackEmpty(ps));--ps->top;
}

思路分析:

(1)首先通过assert断言判断ps栈的地址是否为空(NULL)和!StackEmpty(ps)为真,若栈为空(NULL),则不可以出数据;

(2)然后再通过栈顶top--,完成出栈操作,使栈顶元素变为无效数据,不存在栈里面。 

出栈时的调试窗口: 

测试代码运行结果:

 

6、bool类型判断栈是否为空

//bool类型判断栈是否为空
bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}

思路分析:

        通过bool类型去判断栈是否为空(NULL),通过assert断言判断ps栈的地址是否为空(NULL),若不为空,则返回ps->top == 0比较运算式的最终结果值,即为1或0。

7、取栈顶元素

//取栈顶元素
STDataType StackTop(ST* ps)
{assert(ps);assert(!StackEmpty(ps));return ps->arr[ps->top - 1];
}

思路分析:

        首先通过assert断言判断ps栈的地址是否为空(NULL)和!StackEmpty(ps)为真;最终返回栈顶元素地址,即数组位置top-1。

 

8、获取栈中有效元素个数

//获取栈中有效元素个数
int STSize(ST* ps)
{assert(ps);return ps->top;
}

思路分析:

        通过assert断言判断ps栈的地址,最终返回栈中的有效元素个数,即为栈顶的数组下标。

三、完整实现栈的三个文件

Stack.h

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>//定义栈的结构
typedef int STDataType;
typedef struct Stack
{STDataType* arr;int capacity;//栈的空间大小int top;
}ST;//栈的初始化
void STInit(ST* ps);//栈的销毁
void STDestroy(ST* ps);//栈顶——入数据、出数据
//入栈
void StackPush(ST* ps, STDataType x);//出栈
void StackPop(ST* ps);//bool类型判断是否为空
bool StackEmpty(ST* ps);//取栈顶元素
STDataType StackTop(ST* ps);//获取栈中有效元素个数
int STSize(ST* ps);

Stack.c

#define  _CRT_SECURE_NO_WARNINGS 1
#include<Stack.h>//栈的初始化
void STInit(ST* ps)
{assert(ps);ps->arr = NULL;ps->capacity = ps->top = 0;
}//栈的销毁
void STDestroy(ST* ps)
{assert(ps);if (ps->arr)free(ps->arr);ps->arr = NULL;ps->top = ps->capacity = 0;
}//入栈
void StackPush(ST* ps, STDataType x)
{assert(ps);//判断空间是否足够if (ps->capacity == ps->top){int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newCapacity;}//空间足够ps->arr[ps->top++] = x;
}//出栈
void StackPop(ST* ps)
{assert(ps);assert(!StackEmpty(ps));--ps->top;
}//bool类型判断栈是否为空
bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}//取栈顶元素
STDataType StackTop(ST* ps)
{assert(ps);assert(!StackEmpty(ps));return ps->arr[ps->top - 1];
}//获取栈中有效元素个数
int STSize(ST* ps)
{assert(ps);return ps->top;
}

test.c

#define  _CRT_SECURE_NO_WARNINGS 1#include<Stack.h>void STTest()
{ST st;STInit(&st);//初始化//入栈StackPush(&st, 1);StackPush(&st, 2);StackPush(&st, 3);StackPush(&st, 4);StackPush(&st, 5);//出栈//StackPop(&st);//循环出栈,直到栈为空while (!StackEmpty(&st)){STDataType data = StackTop(&st);//取栈顶元素printf("%d ", data);//出栈StackPop(&st);}printf("size:%d\n", STSize(&st));//获取栈中有效元素的个数STDestroy(&st);//栈的销毁
}int main()
{STTest();return 0;
}

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

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

相关文章

K8s环境下使用sidecar模式对EMQX的exhook.proto 进行流量代理

背景 在使用emqx作为mqtt时需要我们需要拦截client的各种行为&#xff0c;如连接&#xff0c;发送消息&#xff0c;认证等。除了使用emqx自带的插件机制。我们也可以用多语言-钩子扩展来实现这个功能&#xff0c;但是目前emqx仅仅支持单个grpc服务端的设置&#xff0c;所以会有…

论文阅读-U3M(2)

HOW MUCH POSITION INFORMATION DO CONVOLUTIONAL NEURAL NETWORKS ENCODE? 文章目录 HOW MUCH POSITION INFORMATION DO CONVOLUTIONAL NEURAL NETWORKS ENCODE?前言一、位置编码网络&#xff08;PosENet&#xff09;二、训练数据三、实验3.1 位置信息的存在性3.2 分析PosEN…

多机编队—(3)Fast_planner无人机模型替换为Turtlebot3模型实现无地图的轨迹规划

文章目录 前言一、模型替换二、Riz可视化三、坐标变换四、轨迹规划最后 前言 前段时间已经成功将Fast_planner配置到ubuntu机器人中&#xff0c;这段时间将Fast_planner中的无人机模型替换为了Turtlebot3_waffle模型&#xff0c;机器人识别到环境中的三维障碍物信息&#xff0…

X(twitter)推特的广告类型有哪些?怎么选择?

X&#xff08;twitter&#xff09;推特是全球最热门的几大社交媒体平台之一&#xff0c;也是很多电商卖家进行宣传推广工作的阵地之一。在营销过程中不可避免地需要借助平台广告&#xff0c;因此了解其广告类型和适配场景也十分重要。 一、广告类型及选择 1.轮播广告 可滑动的…

谷歌浏览器办公必备扩展推荐有哪些

在现代办公环境中&#xff0c;谷歌浏览器凭借其强大的功能和丰富的扩展生态&#xff0c;成为了许多人日常工作中不可或缺的工具。为了进一步提升办公效率&#xff0c;本文将为您推荐几款实用的谷歌浏览器扩展&#xff0c;并解答在使用过程中可能遇到的一些常见问题。&#xff0…

基于SpringBoot+Vue+Uniapp家具购物小程序的设计与实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而…

【原创】java+springboot+mysql在线课程学习网设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

【xilinx-versal】【Petalinux】添加TMP75温度传感器Linux驱动

Xilinx versal添加TMP75温度传感器Linux驱动 I2C总线的内核配置打开Cadence I2C 控制器配置xilinx I2C配置(不使用)添加设备树总结I2C总线的内核配置 TMP75挂载第一个i2c总线上,地址是0x48。 petalinux-config -c kernel打开内核配置界面。 打开Cadence I2C 控制器配置 │…

MySQL中常见函数

1&#xff0c;日期类函数 1&#xff0c;获取年月日 关键字&#xff1a;current_date(); 2,获取时间 关键字&#xff1a;current_time(); 3,获取时间戳 关键字&#xff1a;current_timestamp(); 注意&#xff0c;MySQL的时间戳显示是以时间的方式显示&#xff0c;所以可以看…

调查显示软件供应链攻击增加

OpenText 发布了《2024 年全球勒索软件调查》&#xff0c;强调了网络攻击的重要趋势&#xff0c;特别是在软件供应链中&#xff0c;以及生成式人工智能在网络钓鱼诈骗中的使用日益增多。 尽管各国政府努力加强网络安全措施&#xff0c;但调查显示&#xff0c;仍有相当一部分企…

Servlet[springmvc]的Servlet.init()引发异常

报错&#xff1a; 原因之一&#xff1a; web.xml配置文件中监听器导入依赖项错误

Node.js 中的 WebSocket 底层实现

WebSockets 是一种网络通信协议&#xff0c;可实现双向客户端-服务器通信。 WebSockets 通常用于需要即时更新的应用程序&#xff0c;使用 HTTP 之上的持久双工通道来支持实时交互&#xff0c;而无需持续进行连接协商。服务器推送是 WebSockets 的众多常见用例之一。 本文首先…

接口测试 —— 如何测试加密接口?

接口加密是指在网络传输过程中&#xff0c;将数据进行加密&#xff0c;以保护数据的安全性。接口加密可以采用多种加密算法&#xff0c;如AES、DES、RSA等。测试接口加密的目的是验证接口加密算法的正确性和安全性。以下是一些详细的测试方法和注意事项&#xff1a; 接口加密字…

centos7.9调整磁盘分区大小

在安装centos7.9时我们一般采用默认分区设置&#xff0c;使用LVM来管理磁盘空间&#xff0c;根分区只有50GB&#xff0c;其余的所有可用空间都分配在/home分区下。可是centos7中大多数的应用软件都是安装在根分区的&#xff0c;在使用过程中经常会出现明明系统还有很大的磁盘空…

Leetcode—1114. 按序打印【简单】(多线程)

2024每日刷题&#xff08;179&#xff09; Leetcode—1114. 按序打印 C实现代码 class Foo { public:Foo() {firstMutex.lock();secondMutex.lock();}void first(function<void()> printFirst) {// printFirst() outputs "first". Do not change or remove t…

【后端开发】自动化部署、服务管理、问题排查工具(cicd流水线,k8s集群,ELK日志)

【后端开发】自动化部署、服务管理、问题排查工具&#xff08;cicd流水线&#xff0c;k8s集群&#xff0c;ELK日志&#xff09; 文章目录 1、Devops与CICD流水线(TeamCity, Jenkins&#xff0c;GitHub Actions)2、Kubernetes 集群的管理和操作&#xff08;对比Portainer&#x…

排序算法上——插入,希尔,选择,堆排序

前言&#xff1a; 常见排序方法如下&#xff1a; 本篇将介绍4种排序方法&#xff0c;分别为插入排序&#xff0c;希尔排序&#xff0c;选择排序&#xff0c;堆排序&#xff0c;并分别举例与讲解。 一. 插入排序 1.1 含义与动图分析 插入排序的思想是在有序区间的下一个位置…

设计模式---责任链模式快速demo

Handler&#xff08;处理者&#xff09;&#xff1a; 定义一个处理请求的接口。通常包括一个处理请求的方法。它可以是抽象类或接口&#xff0c;也可以是具体类&#xff0c;具体类中包含了对请求的处理逻辑。处理者通常包含一个指向下一个处理者的引用。ConcreteHandler&#x…

JAVA封装和包

一.包的概念&#xff1a; 下面是包的目录位置&#xff1a; 在src底下的demo&#xff0c;com&#xff0c;baidu相当于一个文件夹&#xff0c;可以存放类&#xff0c;同一个包类名不能相同&#xff0c;不同的包的类名可以相同。&#xff08;通俗点来说&#xff1a;一个包相当于一…

手撕数据结构 —— 堆(C语言讲解)

目录 1.堆的认识 什么是堆 堆的性质 2.堆的存储 3.堆的实现 Heap.h中接口总览 具体实现 堆结构的定义 初始化堆 销毁堆 堆的插入 堆的向上调整算法 堆的插入的实现 堆的删除 堆的向下调整算法 堆的删除的实现 使用数组初始化堆 获取堆顶元素 获取堆中的数据…