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

news2024/11/16 15:27:58

一.栈的基本介绍

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

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

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

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

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

二.栈的常见操作

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;	//将容量和栈顶指针置0
	st->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.coloradmin.cn/o/2090764.html

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

相关文章

Redis高级---面试总结之内存过期策略及其淘汰策略

目前已更新系列&#xff1a; 当前&#xff1a;Redis高级---面试总结之内存过期策略及其淘汰策略 并发编程之----线程池ThreadPoolExecutor,Excutors的使用及其工作原理 Redis高级----主从、哨兵、分片、脑裂原理-CSDN博客 计算机网络--面试知识总结一 计算机网络-----面试知…

【深度学习】yolov8的微调

yolov8的集成度太高了&#xff0c;除了config的哪些参数以外&#xff0c;需要更精细的微调。 比如这里&#xff1a; https://github.com/ultralytics/ultralytics/blob/main/ultralytics/utils/tuner.py 应用场景&#xff0c;交通标志的向左转&#xff0c;向右转之类的&#x…

Golang | Leetcode Golang题解之第384题打乱数组

题目&#xff1a; 题解&#xff1a; type Solution struct {nums, original []int }func Constructor(nums []int) Solution {return Solution{nums, append([]int(nil), nums...)} }func (s *Solution) Reset() []int {copy(s.nums, s.original)return s.nums }func (s *Solu…

STM32G474之HAL_Delay()会导致死机的原因

使用HAL库需要HAL_Delay()函数支持&#xff0c;离开这个函数&#xff0c;和这个函数有关的函数就无法调用了。遇到这个问题&#xff0c;我们肯定会否定HAL库&#xff0c;也确实它是有点差&#xff0c;但也有好的一面。 为什么HAL库初始化了SysTick定时器&#xff0c;也使能了相…

书生大模型实战营(1)——InterStudio基础知识+Vscode SSH连接远程服务器+Linux基础指令

参加书生.浦江大模型实战训练营&#xff0c;学习大模型知识和微调技术&#xff0c;所有课程免费&#xff0c;通过闯关的形式学习&#xff0c;也比较有趣。一起来了解LLM的世界。邀请链接 产品简介 InternStudio 是大模型时代下的云端算力平台。基于 InternLM 组织下的诸多算法…

Android Handler消息机制完全解析(二)

欢迎转载&#xff0c;转载请注明出处&#xff1a;https://blog.csdn.net/dmk877/article/details/141690289 在阅读本篇博客之前建议先阅读此篇 Android Handler消息机制完全解析(一) 在看Looper源码之前必须要理解ThreadLocal&#xff0c;ThreadLocal在Handler消息机制中起到…

信息安全--(五)物理与环境安全技术(二)机房安全分析与防护

在使用本博客提供的学习笔记及相关内容时&#xff0c;请注意以下免责声明&#xff1a;信息准确性&#xff1a;本博客的内容是基于作者的个人理解和经验&#xff0c;尽力确保信息的准确性和时效性&#xff0c;但不保证所有信息都完全正确或最新。非专业建议&#xff1a;博客中的…

FlowUs 小程序:开启高效之旅,订阅内容超精彩

一、丰富多样的订阅选择 FlowUs 小程序提供了极为丰富的订阅内容。无论你是对知识管理、项目管理感兴趣&#xff0c;还是专注于创意写作、时间规划&#xff0c;都能在这里找到适合自己的订阅选项。从专业的行业资讯到实用的技巧指南&#xff0c;从激发灵感的创意案例到深入的学…

业务解耦-Spring事件监听的三种实现方式

实现ApplicationListener 步骤如下&#xff1a; 1.写Event类&#xff0c;需要继承Spring的ApplicationEvent类 2.写监听类&#xff0c;需要实现Spring的ApplicationListener接口&#xff0c;加上Component注解 3.监听类实现onApplicationEvent方法 4.通过ApplicationContext.p…

开放大世界的全局寻路

开放大世界的寻路一直是很困扰我的一个点&#xff0c;地图大、还是动态可变的&#xff0c;所以寻路会有很多要求。就我们项目来讲&#xff0c;有这几个要求&#xff1a; 能满足极大范围的地图&#xff1b; 地图寻路数据能实时构建&#xff0c;且重建代价很小&#xff1b; 寻路的…

地质灾害监测预警系统的作用

在地球的广阔舞台上&#xff0c;自然灾害如同不可预测的演员&#xff0c;时常上演着惊心动魄的剧目。地震的震撼、滑坡的肆虐、泥石流的咆哮&#xff0c;这些地质灾害不仅给人类生命财产带来巨大威胁&#xff0c;也考验着社会的防灾减灾能力。为了应对这一挑战&#xff0c;地质…

【Linux】在 bash shell 环境下,当一命令正在执行时,按下 control-Z 会?

目录 题目分析答案 题目 分析 ctrl-c&#xff1a; 发送 SIGINT 信号给前台进程组中的所有进程。常用于终止正在运行的程序&#xff1b;ctrl-z&#xff1a; 发送 SIGTSTP信号给前台进程组中的所有进程&#xff0c;常用于挂起一个进程&#xff1b;ctrl-d&#xff1a; 不是发送信…

乐城堡 JoyCastle Unity岗位笔试题

1)实现 move(GameObjct gameObject, Vector3 begin, Vector3 end, float time, bool pingpong){ } 使 gameObject 在 time 秒内&#xff0c;从 begin 移动到 end&#xff0c;若 pingpong 为 true&#xff0c;则在结束时 使 gameObject 在 time 秒内从 end 移动到 begin&#xf…

机器学习中的增量学习(Incremental Learning,IL)策略是什么?

机器学习中的增量学习&#xff08;Incremental Learning&#xff0c;IL&#xff09;策略是什么&#xff1f; 在当今快速发展的数据驱动世界中&#xff0c;传统的静态机器学习模型逐渐显露出局限性。随着数据量的增长和分布的变化&#xff0c;模型需要不断更新&#xff0c;以保…

opc da 服务器数据 转IEC61850项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 应用条件 2 4 查看OPC DA服务器的相关参数 2 5 配置网关采集opc da数据 4 6 用IEC61850协议转发数据 6 7 网关使用多个逻辑设备和逻辑节点的方法 9 8 在服务器上运行仰科OPC DA采集软件 10 9 案例总结 12 1 案例说明 在OPC DA服务…

使用 Vue3 Element Plus 实现el-table中的特定单元格编辑,下拉选择等

效果预览 完整代码(后面有解析) <template><div style="display: flex;align-items: center;justify-co

磁性齿轮箱市场报告:前三大厂商占有大约79.0%的市场份额

磁性齿轮箱是一种用于扭矩和速度转换的非接触式机构。它们无磨损、无摩擦、无疲劳。它们不需要润滑剂&#xff0c;并且可以针对其他机械特性&#xff08;如刚度或阻尼&#xff09;进行定制。 一、全球磁性齿轮箱行业现状与洞察 据 QYResearch 调研团队最新发布的“全球磁性齿轮…

成都高温限电:当电动汽车「无电可充」

8月末的成都&#xff0c;因为高温限电了。 近几日&#xff0c;成都市气象台连续发布了高温红色预警信号。据新华社报道&#xff0c;8月21日&#xff0c;四川电网用电负荷两次创下历史新高&#xff0c;最高达6797万千瓦&#xff0c;较去年最大用电负荷增长近13%&#xff0c;电力…

Golang | Leetcode Golang题解之第385题迷你语法分析器

题目&#xff1a; 题解&#xff1a; func deserialize(s string) *NestedInteger {index : 0var dfs func() *NestedIntegerdfs func() *NestedInteger {ni : &NestedInteger{}if s[index] [ {indexfor s[index] ! ] {ni.Add(*dfs())if s[index] , {index}}indexreturn…

HarmonyOS鸿蒙开发:在线短视频流畅切换最佳实践

简介 为了帮助开发者解决在应用中在线短视频快速切换时容易出现快速切换播放时延过长的问题&#xff0c;将提供对应场景的解决方案。 该解决方案使用&#xff1a; 视频播放框架AVPlayer和滑块视图容器Swiper进行短视频滑动轮播切换。绘制组件XComponent的Surface类型动态渲染…