【C语言】数组栈的实现

栈的概念及结构


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


栈的定义

typedef int STDataType;
typedef struct Stack
{STDataType* _a;//数组int _top; // 栈顶,类似顺序表中的_sizeint _capacity; // 容量
}Stack;

对栈的操作

栈初始化

_top可以初始化为0,此时栈顶元素是_top-1的位置

_top也可以初始化为1,此时栈顶元素就是_top的位置

初始化为0

      初始化为1

// 初始化栈
void StackInit(Stack* ps)
{assert(ps);ps->_a = NULL;ps->_capacity = 0;ps->_top = 0;
}

压栈(入栈)

// 入栈
void StackPush(Stack* ps, STDataType data)
{assert(ps);//扩容if (ps->_capacity == ps->_top){int newcapacity = ps->_capacity == 0 ? 4 : 2 * (ps->_capacity);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++] = data;
}

出栈

void StackPop(Stack* ps)
{assert(ps);assert(!StackEmpty(ps));ps->_top--;
}

取栈顶元素

STDataType StackTop(Stack* ps)
{assert(ps);return ps->_a[ps->_top-1];
}

判断栈是否为空

bool StackEmpty(Stack* ps)
{assert(ps);return ps->_top == 0;
}

栈的长度

_top初始化为0,此时的_top的大小刚好就是栈的长度

int StackSize(Stack* ps)
{assert(ps);return ps->_top;
}

栈销毁

void StackDestroy(Stack* ps)
{assert(ps);ps->_capacity = ps->_top = 0;free(ps->_a);ps->_a = NULL;
}

完整总代码

头文件

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{STDataType* _a;//数组int _top; // 栈顶,类似顺序表中的_sizeint _capacity; // 容量
}Stack;
// 初始化栈
void StackInit(Stack* ps);
// 入栈
void StackPush(Stack* ps, STDataType data);
// 出栈
void StackPop(Stack* ps);
// 获取栈顶元素
STDataType StackTop(Stack* ps);
// 获取栈中有效元素个数
int StackSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool StackEmpty(Stack* ps);
// 销毁栈
void StackDestroy(Stack* ps);

函数定义

#include"Stack.h"
// 初始化栈
void StackInit(Stack* ps)
{assert(ps);ps->_a = NULL;ps->_capacity = 0;ps->_top = 0;
}
// 入栈
void StackPush(Stack* ps, STDataType data)
{assert(ps);//扩容if (ps->_capacity == ps->_top){int newcapacity = ps->_capacity == 0 ? 4 : 2 * (ps->_capacity);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++] = data;
}
// 出栈
void StackPop(Stack* ps)
{assert(ps);assert(!StackEmpty(ps));ps->_top--;
}
// 获取栈顶元素
STDataType StackTop(Stack* ps)
{assert(ps);return ps->_a[ps->_top-1];
}
// 获取栈中有效元素个数
int StackSize(Stack* ps)
{assert(ps);return ps->_top;
}
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool StackEmpty(Stack* ps)
{assert(ps);return ps->_top == 0;
}
// 销毁栈
void StackDestroy(Stack* ps)
{assert(ps);ps->_capacity = ps->_top = 0;free(ps->_a);ps->_a = NULL;
}

测试

#include"Stack.h"
void test()
{Stack s;StackInit(&s);StackPush(&s, 1);StackPush(&s, 2);StackPush(&s, 3);StackPush(&s, 4);while (StackSize(&s)>0){printf("%d ", StackTop(&s));StackPop(&s);}StackDestroy(&s);
}
int main()
{test();return 0;
}

欢迎各位一起学习交流~

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

springboot校园跑腿服务系统-计算机毕业设计源码15157

摘要 本文介绍了一种基于Springboot和uniapp的校园跑腿服务系统的设计与实现。该系统旨在为大学校园提供一种方便快捷的跑腿服务&#xff0c;满足学生和教职员工的日常需求。首先&#xff0c;系统采用了Springboot作为后端框架&#xff0c;利用其轻量级、高效的特性&#xff0c…

学习笔记 韩顺平 零基础30天学会Java(2024.7.22)

P407 接口使用细节2 P407 接口课堂练习 对于最后一个的输出&#xff1a;B因为实现了A的接口&#xff0c;所以和继承一样&#xff0c;B可以访问A的变量 P409 接口VS继承 接口对单继承机制&#xff08;是指只能继承一个类&#xff09;进行了补充 也可以理解为&#xff0c;子类通过…

请你谈谈:针对Mybatis引出的Spring事务的探究2:spring事务的失效

Spring事务失效的常见场景主要包括以下几个方面&#xff0c;这些场景通常是由于对Spring事务管理机制的误解或不当使用所导致的&#xff1a; 方法访问级别不当&#xff1a; 如前所述&#xff0c;Spring AOP默认不会拦截非public方法。因此&#xff0c;如果Transactional注解被…

通信原理-实验六:实验测验

实验六 实验测验 一&#xff1a;测验内容和要求 测试需要完成以下几个步骤&#xff1a; 配置好以下网络图&#xff1b;占总分10%&#xff08;缺少一个扣一分&#xff09;根据下面图配置好对应的IP和网关以及路由等相关配置&#xff0c;保证设备之间连通正常&#xff1b;占总…

《AIGC 实战宝典》(2024版) 正式发布!

2024 新年伊始&#xff0c;OpenAI 推出文生视频 Sora&#xff0c;风靡整个科技圈。 最近又发布了 ChatGPT-4o&#xff0c;这是一个全新模型&#xff0c;不仅能处理文本&#xff0c;还能实时理解和生成音频和图像。OpenAI 用实际行动给全世界的科技公司又上了一课。 如何从0到1…

C++(week14): C++提高:(一)面向对象设计:设计原则、设计模式

文章目录 一、面向对象设计的概念4.统一建模语言&#xff1a;UML语言StartUML 二、类与类之间的关系0.总结1.继承 (泛化耦合)2.组合 (Composition)3.聚合 (Aggregation)4.关联(1)双向关联(2)单向关联 5.依赖 (Dependency) 三、面向对象设计的原则0.总结1.单一职责原则 (Single …

你还以为前端无法操作文件吗

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 这里面有个值得说明一点的问题是&#xff0c;我一直以为&#xff08;可能有人跟我一样&#xff09;前端是无法操作文件的&#xff0c;可实际上自从HTML5标准出现之后&#xff…

昇思25天学习打卡营第21天|CV-Shufflenet图像分类

打卡 目录 打卡 ShuffleNet 网络介绍 ShuffleNet 模型架构 Pointwise Group Convolution Channel Shuffle ShuffleNet模块 ShuffleNet 模块代码 构建ShuffleNet网络 模块代码 模型训练和评估 模型训练 模型评估 模型预测 ShuffleNet 网络介绍 ShuffleNetV1是旷视科…

数字图像处理笔记(三) ---- 傅里叶变换的基本原理

系列文章目录 数字图像处理笔记&#xff08;一&#xff09;---- 图像数字化与显示 数字图像处理笔记&#xff08;二&#xff09;---- 像素加图像统计特征 数字图像处理笔记&#xff08;三) ---- 傅里叶变换的基本原理 文章目录 系列文章目录前言一、傅里叶变换二、离散傅里叶变…

JCR一区级 | Matlab实现TTAO-Transformer-LSTM多变量回归预测

JCR一区级 | Matlab实现TTAO-Transformer-LSTM多变量回归预测 目录 JCR一区级 | Matlab实现TTAO-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【JCR一区级】Matlab实现TTAO-Transformer-LSTM多变量回归预测&#xff0c;三角拓扑聚合…

【运维自动化-配置平台】模型及模型关联最小化实践

蓝鲸智云配置平台&#xff0c;以下简称配置平台 我们知道主机是配置平台最常见的管控资源对象&#xff0c;在业务拓扑里可以通过划分模块来清晰的可视化管理&#xff1b;那其他资源如何通过配置平台来纳管呢&#xff0c;比如网络设备交换机。场景需求&#xff1a;如何把交换机…

【Linux 驱动】IMX6ULL eLCDIF参考手册翻译

1. eLCDIF 1.1 概述 eLCDIF是一种通用的显示控制器&#xff0c;用于驱动各种尺寸和性能不同的显示设备。 eLCDIF块支持以下功能&#xff1a; 支持MPU接口&#xff08;8080模式和6800模式&#xff09;支持DOTCLK接口&#xff08;RGB接口&#xff09;VSYNC模式&#xff1a;针对高…

Maven高级——详解

目录 一、分模块设计 二、分模块设计小实践 三、Maven继承 1.继承关系实现 ​编辑 2.版本锁定 dependencyManagement 自定义属性/引用属性 四、Maven聚合 五、Maven私服 一、分模块设计 为什么要分模块设计&#xff0c;将项目按照功能拆分分成若干个子模…

QT串口和数据库通信

创建串口 串口连接客户端并向服务器发送消息 client.pro #------------------------------------------------- # # Project created by QtCreator 2024-07-02T14:11:20 # #-------------------------------------------------QT core gui network QT core gui…

房屋出租系统 学习笔记 韩顺平 零基础30天学会Java(2024.7.15)

代码见package houserent P362 房屋出租需求 P363 房屋出租设计 分层模式 P364 房屋出租工具 给了一个工具包&#xff1a;Utility&#xff0c;使用&#xff1a;String s2 Utility.readString(10,”hspedu”);来限制输入字符大小最大是10&#xff0c;同时初始化的值为hspedu&a…

完全移动huggingface模型仓库(不是简单mv)

Linux中移动huggingface模型仓库 参考链接 先在bashrc中配置&#xff1a; export HF_DATASETS_CACHE"/your/path/dataset" export HF_HOME"/your/path/" export HUGGINGFACE_HUB_CACHE"/your/path/hub" export TRANSFORMERS_CACHE"/your…

速腾聚创激光雷达复现FAST-LIO

目录 1.软件环境 2.测试执行 3.代码学习 3.1.找主节点代码文件 3.2.整体流程结构 3.3.具体函数理解 记录复现FAST-LIO算法的过程和&#xff0c;代码梳理和理解 1.软件环境 Windows 10(64bits) VMware 16 Pro Ubuntu 20.04 ROS Noetic FAST-LIO的简化版、注释版。感谢…

Hospital 14.6.0全开源医院管理预约系统源码

InfyHMS 具有 60 种功能和 9 种不同类型的用户类型&#xff0c; 他们可以登录系统并根据他们的角色访问他们的数据。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89580674 更多资源下载&#xff1a;关注我。

Top-down Microarchitecture Analysis Method

1、英文链接&#xff1a; 1. https://www.intel.com/content/www/us/en/docs/vtune-profiler/cookbook/2023-0/top-down-microarchitecture-analysis-method.html 2. http://portal.nacad.ufrj.br/online/intel/vtune2017/help/GUID-02271361-CCD4-410C-8338-4B8158157EB6.ht…

LC61----1374. 生成每种字符都是奇数个的字符串(字符串)---java版

1.题目 2.思路 &#xff08;1&#xff09;题目要生成每种字符是奇数个的字符串。 &#xff08;2&#xff09;所以直接用参数n%2来判断。 (3)返回的字符串必须只含小写英文字母。如果存在多个满足题目要求的字符串&#xff0c;则返回其中任意一个即可。 (4)感觉题目不是很规范哈…