数据结构-c/c++实现栈(详解,栈容量可以动态增长)

一.栈的基本介绍

        栈是一种只能够在一端进行插入和删除的顺序表。如下图

空栈:表示不含任何元素的栈

栈顶:表示允许进行插入和删除元素的一端

栈底:表示不允许进行插入和删除元素的一端

即栈是一种后进先出的线性表数据结构

二.栈的常见操作

StackInit:初始化栈

StackDestory:销毁栈

StackPop:删除栈顶元素

StackPush:向栈顶插入元素

StackSize:计算栈中元素并返回

StackEmpty:判断栈是否为空

StackTop:返回栈顶元素

三.各操作代码实现详解

        栈结构的描述代码

typedef int DataType;typedef struct Stack
{DataType* a;    //存储栈的数组int Top;        //指向栈顶元素的下标int Size;       //栈元素大小
}ST;

3.1 StackInit

        初始化栈只需要对栈中的三个元素依次初始化即可

//初始化栈
void StackInit(ST* st)
{assert(st != nullptr);st->a = nullptr;st->Top = 0;st->Size = 0;
}

3.2 StackDestory

//销毁栈
void StackDestory(ST* st)
{assert(st != nullptr);free(st->a);	//释放数据st->Size = 0;	//将容量和栈顶指针置0st->Top = 0;
}

3.3 StackPop

//删除数据
void StackPop(ST* st)
{assert(st != nullptr);assert(st->Top > 0);//有数据才能删除st->Top--;//直接让Top减少1即可
}

3.4 StackPush

//插入数据
void StackPush(ST* st, DataType x)
{assert(st != nullptr);if (st->Size == st->Top){int newCapacity = st->Size == 0 ? 4 : st->Size * 2;//设置新空间大小,每次增长两倍DataType* tmp = new DataType[newCapacity];for (int i = 0; i < st->Size; i++){tmp[i] = st->a[i];}//C语言方式//DataType* tmp = (DataType*)realloc(st->a, sizeof(DataType) * newCapacity);if (tmp == nullptr){cout << "new error" << endl;exit(-1);}st->a = tmp;st->Size = newCapacity;}st->a[st->Top] = x;st->Top++;
}

3.5 StackSize

//计算栈容量大小
int StackSize(ST* st)
{assert(st != nullptr);assert(st->Top != 0);return st->Top;
}

3.6 StackEmpty

//判断栈是否为空
bool StatkEmpty(ST* st)
{assert(st->a);if (st->Top == 0){return true;}else{return false;}
}

3.7StackTop

//返回栈顶数据
DataType StackTop(ST* st)
{assert(st != nullptr);assert(st->Top > 0);          //栈顶有元素才能返回return st->a[st->Top - 1];    //位置是Top-1的原因是Top从0开始,表示的是栈顶的后一位
}

四.简单测试

        测试代码1

#define _CRT_SECURE_NO_WARNINGS 1
#include"stack.h"void test1()
{ST st;StackInit(&st);StackPush(&st, 1);StackPush(&st, 9);StackPush(&st, 4);StackPush(&st, 6);StackPush(&st, -1);while (!StackEmpty(&st)){cout << StackTop(&st) << endl;StackPop(&st);}
}int main()
{test1();
}

运行结果

加入pop

#define _CRT_SECURE_NO_WARNINGS 1
#include"stack.h"void test1()
{ST st;StackInit(&st);StackPush(&st, 1);StackPush(&st, 9);StackPop(&st);StackPush(&st, 4);StackPop(&st);StackPush(&st, 6);StackPush(&st, -1);while (!StackEmpty(&st)){cout << StackTop(&st) << endl;StackPop(&st);}
}int main()
{test1();
}

测试结果

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

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

相关文章

为什么我的手机卡需要快递员给激活?这到底安全吗?

网友咨询&#xff1a;网上申请了一张新卡&#xff0c;本来想着自己激活&#xff0c;没想到快递员先打电话过来说&#xff0c;要身份证给帮助激活&#xff0c;所以我想问一下&#xff0c;网上申请的卡是不是都是快递给激活呢&#xff1f;安不安全呢&#xff1f; 首先要说一下&a…

第4章-08-用Python Requests库模拟浏览器访问接口

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Web爬虫入门与实战精讲,后续完整更新内容如下。 文章…

CSRF漏洞的预防

目录 CSRF漏洞预防措施 深入研究 CSRF Token的工作原理是什么&#xff1f; 为什么仅依靠Referer头字段来防范CSRF攻击不是完全可靠&#xff1f; SameSite cookie属性如何防止CSRF攻击&#xff1f; SameSite Cookie属性的作用 如何通过SameSite属性防止CSRF攻击 导图 CS…

Eclipse 自定义字体大小

常用编程软件自定义字体大全首页 文章目录 前言具体操作1. 打开设置对话框2. 打开字体设置页面3. 找到Text Font&#xff0c;点击修改4. 修改字体 前言 Eclipse 自定义字体大小&#xff0c;统一设置为 Courier New &#xff0c;大小为 三号 具体操作 【Windows】>【Perfer…

Qt第二课----信号和槽

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

C#笔记4 详细解释事件及其原型、匿名方法和委托的关系

匿名方法 定义 匿名方法允许一个与委托关联的代码被内联的写入使用委托的位置。 语法形式 delegate(参数列表) {代码块 } 前文说过&#xff0c;委托是定义了一个公司&#xff0c;公司专门承接某一类型的任务。 委托的实例化就是公司把任务交给了具体的职员&#xff08;方…

掌握测试的艺术:深入探索Python的pytest库

文章目录 **掌握测试的艺术&#xff1a;深入探索Python的pytest库**背景&#xff1a;为什么选择pytest&#xff1f;pytest是什么&#xff1f;如何安装pytest&#xff1f;5个简单的库函数使用方法1. pytest.main()2. pytest.skip()3. pytest.mark.parametrize()4. pytest.raises…

基于物联网的低成本便携式传感器节点用于火灾和空气污染的检测与报警

目录 摘要 引言 材料和方法 传感器节点 IoT 微控制器 颗粒物传感器 环境和气体传感器 MQTT代理 Node-Red监控平台 系统结构 数据存储 工作描述 实验结果 讨论 结论 致谢 参考文献 这篇论文的标题是《Low-cost IoT-based Portable Sensor Node for Fire and Air…

STM32G474之TIM1捕获1模式

STM32G474采用TIM8产生方波信号&#xff0c;使用TIM1工作于捕获1模式&#xff0c;并计算方波频率。捕获方波周期&#xff0c;在有些开发中&#xff0c;还是能用到。建议开发时使用HAL库自带的库函数。使用寄存器方法也可以实现&#xff0c;但是后期修改不太方便。 测试时&…

利用 Web 浏览器构建 Java Media Player

如果您需要在 Java 桌面应用程序中嵌入媒体播放器&#xff0c;有几种方法可供选择&#xff1a; 您可以使用 JavaFX Media API 来实现所有必需的媒体播放器功能。虽然稍显过时但仍然可用的 Java Media Framework 也可以作为一种解决方案。您可以集成像 VLCJ 这样的第三方 Java …

如何选择适合企业的财税自动化解决方案

财税自动化解决方案是现代企业提升财务管理效率、降低运营成本的关键工具。然而&#xff0c;市场上的财税自动化产品琳琅满目&#xff0c;功能各异&#xff0c;企业在选择时常常感到困惑。本文金智维将从中小型的需求出发&#xff0c;帮助企业了解如何选择适合自身的财税自动化…

QT实战项目之音乐播放器

项目效果演示 myMusicShow 项目概述 在本QT音乐播放器实战项目中,开发环境使用的是QT Creator5.14版本。该项目实现了音乐播放器的基本功能,例如开始播放、停止播放、下一首播放、上一首播放、调节音量、调节倍速、设置音乐播放模式等。同时还具备搜索功能,通过搜索歌曲名字…

另一种关于类的小例

前言 我们还是以一段关于构造函数的代码作为开端&#xff0c;我们以之前银行家的小项目为背景 class Account {constructor(owner, currency, pin) {this.owner owner;this.currency currency;this.pin pin;} }const ITshare new Account(ITshare, EUR, 21211); console.…

零基础入门天池镜像提交--windows场景VirtualBox虚拟机安装linux系统并ssh远程登录,直至镜像的制作及提交

背景&#xff1a;由于本人只有一台windows,天池上的比赛需要提交镜像&#xff0c;自己试了好多方法给windows安装linux&#xff0c;但是始终没安装成功。最终采用在利用VirtualBox安装linux虚拟机&#xff0c;使用MobaXterm进行ssh登陆linux&#xff0c;镜像的制作、push、提交…

Java+Swing实现学生选课管理系统

JavaSwing实现学生选课管理系统 一、系统介绍二、系统展示1.课程查询2.课程添加3.退课 三、系统实现四、其他1.其它系统2.获取源码 一、系统介绍 本系统实现了学生登录和管理员登录&#xff0c;学生实现选课&#xff0c;查看已选课程&#xff0c;修改密码&#xff0c;查看学生…

Java | Leetcode Java题解之第386题字典序排数

题目&#xff1a; 题解&#xff1a; class Solution {public List<Integer> lexicalOrder(int n) {List<Integer> ret new ArrayList<Integer>();int number 1;for (int i 0; i < n; i) {ret.add(number);if (number * 10 < n) {number * 10;} els…

顺序表

目录 1. 数据结构 2. 顺序表 1&#xff09;线性表 2&#xff09;顺序表分类 3、动态顺序表的实现 1. 数据结构 数据&#xff1a;常见的数值1、2、3、4.....、教务系统里保存的用户信息&#xff08;姓名、性别、年龄、学历等 等&#xff09;、网页里肉眼可以看到的信息&…

vTESTstudio系列12--vTESTstudio中的动态函数库介绍2

在上期的文章&#xff08;vTESTstudio系列11--vTESTstudio中的动态函数库介绍1&#xff09;中&#xff0c;我们详细介绍了osek_tp.dll的接口&#xff0c;本章开始给大家介绍如何通过osek_tp.dll的接口去发送诊断指令&#xff0c;Let‘s Go!!! 目录 1. CanTp发送数据的函数&am…

图表操作——图表保存为图片+多个图表批量保存为压缩包——js技能提升

使用场景&#xff1a; echarts图表&#xff1a;生成的柱状图/折线图/饼图等可以实现图表的导出&#xff0c;导出格式为一个图片。也可以支持多个图表同时导出为图片&#xff0c;以压缩包的形式下载下来。 下面介绍单个导出批量导出的具体用法&#xff1a; 1.单个导出功能——…

可信捐赠系统的设计与开发论文

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统可信捐赠系统信息管理难度大&#xff0c;容错率低&#x…