数据结构:基于数组实现栈

1 前言

栈是一种先进后出的线性表。向一个栈插入新元素可以叫做进栈、入栈、压栈,新元素必须放到栈顶元素上面,使之成为新的栈顶;从一个栈删除元素可以叫做出栈、退栈,它将栈顶元素删除,使和原来栈顶元素相邻的元素称为新的栈顶。出栈和入栈的示意图如下:
在这里插入图片描述

2 栈的实现

2.1 栈相关宏定义和枚举类型定义

#define STACK_SIZE 10
#define DATA_TYPE unsigned chartypedef enum
{STATCK_NULL = 0, /* 栈空 */STATCK_NOTNULL,  /* 栈非空 */STATCK_FULL,     /* 栈满 */
} stack_state_type;       /* 栈状态 */

为了便于实现不同数据大小和数量的栈,这里可以使用宏定义DATA_TYPE表示各种类型的数据,使用STACK_SIZE表示栈大小。

2.2 栈结构体定义

typedef struct
{int stackTop;                    /* 栈顶指针 */DATA_TYPE stackBuff[STACK_SIZE]; /* 栈空间 */
} stack_t;

定义一个栈顶指针指示栈顶位置,同时兼具栈大小指示作用。定义一个栈空间,用来保存元素。

2.3 栈相关函数定义

/*** @brief 初始化栈** @param stack 栈指针*/
void stack_init(stack_t *stack)
{stack->stackTop = 0;
}/*** @brief 数据入栈** @param stack 栈指针* @param data 数据* @return int -1:失败 0:成功*/
int stack_push(stack_t *stack, DATA_TYPE data)
{if (stack->stackTop >= STACK_SIZE){return -1;}stack->stackBuff[stack->stackTop++] = data;return 0;
}/*** @brief 数据出栈** @param stack 栈指针* @return int -1:失败 0:成功*/
int stack_pop(stack_t *stack)
{if (stack->stackTop <= 0){return -1;}stack->stackTop--;return 0;
}/*** @brief 获取栈大小** @param stack 栈指针*/
int stack_size(stack_t *stack)
{return stack->stackTop;
}/*** @brief 获取栈状态* * @param stack 栈指针* @return stack_state_type 栈状态 STATCK_NULL/STATCK_NOTNULL/STATCK_FULL*/
stack_state_type stack_state(stack_t *stack)
{stack_state_type stackState;if (stack->stackTop == 0){stackState = STATCK_NULL;}else if ((stack->stackTop > 0) && (stack->stackTop < STACK_SIZE)){stackState = STATCK_NOTNULL;}else{stackState = STATCK_FULL;}return stackState;
}

设计的栈相关函数包括:初始化栈、数据入栈、数据出栈、获取栈大小、获取栈状态5个

3 测试

我们定义一个栈,然后使用2中我们设计的5个函数,最后打印结果看是否和预期一致。测试代码如下:

int main(void)
{int i;stack_t stack;stack_init(&stack);for (i = 0; i < STACK_SIZE; i++){stack_push(&stack, i + 1);}stack_pop(&stack);stack_pop(&stack);printf("Stack state : %d\r\n", stack_state(&stack));printf("Stack size  : %d\r\n", stack_size(&stack));printf("Stack data  :");for (i = 0; i < stack_size(&stack); i++){printf("%d ", stack.stackBuff[i]);}printf("\r\n");return 0;
}

打印结果如下:
在这里插入图片描述
结果和我们预期一致,测试成功。

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

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

相关文章

RabbitMQ 实验消费原始队列消息, 拒绝(reject)投递死信交换机过程

如果你想通过 RabbitMQ 的死信队列功能实现消费者拒绝消息投递到死信交换机的行为&#xff0c;你可以按照以下步骤操作&#xff1a; 创建原始队列&#xff0c;并将其绑定到一个交换机上&#xff1a; export RABBITMQ_SERVER127.0.0.1 export RABBITMQ_PORT5672 export RAB…

Apache Hive的基本使用语法(二)

Hive SQL操作 7、修改表 表重命名 alter table score4 rename to score5;修改表属性值 # 修改内外表属性 ALTER TABLE table_name SET TBLPROPERTIES("EXTERNAL""TRUE"); # 修改表注释 ALTER TABLE table_name SET TBLPROPERTIES (comment new_commen…

Tomcat配置https

前言&#xff1a;本文内容为实操记录&#xff0c;仅供参考&#xff01; 一、证书 CA证书申请下载不赘述了。 二、上传证书 进入tomcat根目录&#xff0c;conf同级目录下创建cert文件夹&#xff0c;并将证书两个文件上传到该文件夹&#xff1b; 三、编辑conf/server.xml文件 ① …

20221124 kafka实时数据写入Redis

一、上线结论 实现了将用户线上实时浏览的沉浸式视频信息&#xff0c;保存在Redis中这样一个功能。为实现沉浸式视频离线推荐到实时推荐提供了强有力的支持。目前只是应用在沉浸式场景&#xff0c;后续也能扩展到其他所有场景。用于两个场景&#xff1a;&#xff08;1&#xf…

WPF自定义Panel:让拖拽变得更简单

在 WPF 应用程序中&#xff0c;拖放操作是实现用户交互的重要组成部分。通过拖放操作&#xff0c;用户可以轻松地将数据从一个位置移动到另一个位置&#xff0c;或者将控件从一个容器移动到另一个容器。然而&#xff0c;WPF 中默认的拖放操作可能并不是那么好用。为了解决这个问…

Vue中v-for多个Echarts图表组件只渲染一个要素问题排查

这个系列主要是用于记录我日常工作中遇到的一些Bug,既属于知识分享&#xff0c;也是对学习习惯的维持… 问题描述 今天&#xff0c;在开发一个WebGIS大屏项目时&#xff0c;我遇到了多个三维Echarts饼图图表渲染的问题&#xff0c;因为相似图表很多&#xff0c;我决定将Echart图…

Unity3d使用Jenkins自动化打包(Windows)(二)

文章目录 前言一、Unity工程准备二、Unity调取命令行实战一实战二实战三实战四实战五 总结 前言 自动化打包的价值在于让程序员更轻松地创建和管理构建工具链&#xff0c;提高编程效率&#xff0c;将繁杂的工作碎片化&#xff0c;变成人人&#xff08;游戏行业特指策划&#x…

CDH集群hive初始化元数据库失败

oracle数据库操作&#xff1a; 报错如下&#xff1a;命令 (Validate Hive Metastore schema (237)) 已失败 截图如下&#xff1a; 后台日志部分摘录&#xff1a; WARNING: Use “yarn jar” to launch YARN applications. SLF4J: Class path contains multiple SLF4J binding…

tdesign坑之EnhancedTable树形结构默认展开所有行

⚠️在官方实例中&#xff0c;树形结构的表格提供了2种方法控制展开全部节点&#xff1a; 一是通过配置属性tree.defaultExpandAll为true代表默认展开全部节点&#xff08;仅默认情况有效&#xff09;&#xff1b; 二是使用组件实例方法expandAll()可以自由控制树形结构的展开…

VESTA模拟计算XRD标准卡片

先上Crystallography Open Database网站下载标准CIF卡片&#xff08;以PbI2为例&#xff09; 1.直接进网站搜元素就行 2.点CIF直接下载 3.打开VESTA&#xff0c;导入刚刚下载的CIF 4.导入成功就是这样的 5.按照我这个操作来计算 6.点Calculation 7.已经计算出来了&#xff…

Jmeter参数化 —— 循环断言多方法

1、参数化接口测试数据 注意&#xff1a;csv文档参数化&#xff0c;里面有多少条数据&#xff0c;就要在线程组里循环多少次&#xff0c;不然就只执行一次 2、添加配置元件-计数器 关于计数器&#xff1a; ①Starting Value&#xff1a;给定计数器的初始值; ②递增&#xff1a…

计算机专业学习单片机有什么意义吗?

玩单片机跟玩计算机区别还是很大的, 单片机有众多的种类,每一种又可能有很多个系列.可以说单片机就是为了专款专用而生的.这样来达到产品成本的降低,这就是现在身边的很多的电子产品价格一降再降的原因之一.在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一…