(C++)栈的顺序存储及实现(出栈、入栈、判空、遍历、销毁)(数据结构与算法)

顺序栈结构方案一: 创建栈底指针base、栈顶指针top

#include <iostream>
#include <Windows.h>
using namespace std;

//顺序栈的结构类型
#define	 MaxSize 50			//定义栈中元素的最大个数为50
typedef  int  SElemType;	//栈存储的数据类型,用int代替SElemType  

//创建顺序栈
typedef struct
{
	SElemType* base;  //栈底指针   base指针不动、top往上移
	SElemType* top;  //栈顶指针
	int stackSize;	// 当前已分配的存储空间大小,即顺序栈的大小
}SqStack;			//顺序栈的结构体定义

bool InitStack(SqStack& stack);	//初始化栈
bool StackEmpty(SqStack& stack);//判断是否为空
bool StackFull(SqStack& stack);	//判断是否已满
int  StackLength(SqStack& stack);//获取栈已存储的元素个数
bool PushStack(SqStack& stack, SElemType value);//入栈
bool PopStack(SqStack& stack, SElemType& vlaue);//出栈
bool GetStack(SqStack& stack, SElemType& value);//获取栈顶的元素
void DestoryStack(SqStack& stack);//销毁栈、释放栈的内存

//初始化顺序栈
bool InitStack(SqStack& stack)
{
	//动态分配一个SElemType类型MaxSize长度的空间,将地址给顺序栈stack的栈底指针
	stack.base = new SElemType[MaxSize];
	//stack.base = (SElemType*)malloc(MaxSize * sizeof(SElemType); C语言语法
	//判断顺序栈的栈底指针(stack.base)是否为空,若无地址,则分配失败
	if (!stack.base)  //判断是否分配内存失败
	{
		return false;
	}
	stack.top = stack.base;		 //初始化为空栈,栈顶栈底指向同一个位置
	stack.stackSize = MaxSize; //空的顺序栈,有MaxSize个空间可以存储
	return true;   //初始化完成
}

//判断栈空
bool StackEmpty(SqStack& stack)
{
	//cout << "判断栈空的结果为:";
		if(stack.top == stack.base) //当栈顶、栈底指针指向同一位置时栈为空
		{
			//cout << "栈空" << endl;
			return true;  
		}
		else
		{
			//cout << "栈不空" << endl;
			return false; 
		}
}
//判断栈满
bool StackFull(SqStack& stack)  //指针top减去指针base, 通过两指针相减所得判断之中相隔元素个数
{
	if ((stack.top - stack.base) == MaxSize)	//若两指针位置相减 等于 栈的大小 则栈为满栈
	{
		//cout << "栈满" << endl;
		return true; 
	}
	else
	{
		return false; 
	}
}
//顺序栈入栈: 判断是否栈满,如果栈已满,则入栈失败,否则将元素放入栈顶,栈顶指针向上移动一个空间(top++)。
//栈顶永远指向下一个待插入元素的位置,即指向最后一个元素的下一地址。
bool PushStack(SqStack& stack, SElemType value)
{
	if (StackFull(stack))  //满栈
	{
		cout << "栈满" << endl; 
		return false; 
	}
	//若栈未满,执行入栈操作
	*stack.top = value;  //将要插入的value值,放入top指针所指的空间中
	stack.top++;   //栈顶指针加1,向上移动一位,更新栈顶位置。
	//或者写成 *stack.top++=value;
	return true; 
}

//顺序栈出栈:判断是否栈空,如果栈空,出栈失败。否则将栈顶元素输出,栈顶指向减 1 
bool PopStack(SqStack& stack, SElemType &value)
{
	if (StackEmpty(stack))  //判断栈是否为空
	{
		cout << "栈为空" << endl;
		return false; 
	}
	stack.top--;  //栈顶指针下移一位,指向最后一个元素
	value = *stack.top;  //将栈顶指针所指向地址中的数据元素存入value中返回。
	//或者:value = *--stack.top;
	return true; 
}

//获取栈顶元素: 首先也要判断栈是否为空
//取栈和出栈不同,取栈顶元素是把其赋值一份,栈的元素个数保持不变,所以栈顶指针最后也不变。
//而出栈是将栈顶元素从原有栈中拿走,最终栈顶指针要减 1,即向下移动一位 。
bool GetStack(SqStack& stack, SElemType& value)     
{
	if (StackEmpty(stack))
	{
		cout << "栈为空" << endl;
		return false;
	}
	value = *(stack.top - 1); //将栈顶指针下一位空间所存储的元素取出,并赋值给value返回 实际栈顶指针位置不变。
	return true; 
}

//清空栈:  释放内存
void DestoryStack(SqStack& stack)
{
	if (stack.base)  //若栈底指针有分配地址。
	{
		delete stack.base;   //释放栈底指针的地址
		stack.top = NULL;     //令栈顶、栈底指针指向空
		stack.base = NULL;
		stack.stackSize = 0;
		cout << "栈已释放内存!" << endl; 
	}
}

//获取顺序栈存储的元素个数:栈顶指针减去栈尾指针即为栈所存储的元素个数
int StackLength(SqStack& stack)    //栈顶指针减去栈底指针,所得即为二者间相隔的元素个数
{
	return (stack.top - stack.base); //返回栈中元素个数
}

int main10_1()
{
	//创建顺序栈
	SqStack stack;
	
	//初始化栈
	InitStack(stack);
	//插入元素
	int number = 0; //插入元素个数
	int value = 0;	//插入元素值
	cout << "请输入需要插入的元素个数:";
	cin >> number;//输入数据元素
	while ((number--) > 0)//插入元素个数计数
	{
		cin >> value;   //输入数据
		PushStack(stack, value);  //插入所输入的数据
	}
	//测试顺序栈
	//获取栈顶的元素
	GetStack(stack, value);
	cout << "当前栈顶元素是:" << value << endl;
	cout << "当前栈的元素个数是:" << StackLength(stack) << endl;

	//出栈
	cout << "出栈顺序:" << endl;
	while (!StackEmpty(stack))   //栈不为空,进入循环
	{
		PopStack(stack, value);
		cout << value << " ";
	}
	cout << endl;  

	//销毁、释放栈的内存
	DestoryStack(stack);
	
	system("pause");
	return 0;
}

顺序栈结构方案二:创建栈底指针、栈顶位置

#include<iostream>
#include<Windows.h>
using namespace std;

#define MaxSize  128		//栈最大可以存放的元素个数
typedef int SElemType;		//顺序栈存储的数据类型、用int代替SElemType

//创建顺序站
typedef struct
{
	SElemType* base; //栈底指针
	int top;		 //栈顶的位置 如 0、1、2、3、4....MaxSize
}SqStack;			 //顺序栈的结构体定义

//初始化顺序栈
bool InitStack(SqStack& stack)
{
	//动态分配一个SElemType类型MaxSize长度的空间,将地址给顺序栈Stack的栈底指针
	stack.base = new SElemType[MaxSize];
	//判断顺序栈的栈底指针(stack.base)是否为空,若无地址,则分配失败
	if (!stack.base)
	{
		return false; 
	}
	stack.top = 0;		//初始化栈顶指针的位置为0
	return true; 
}

//判断栈空   ;
bool StackEmpty(SqStack& stack)
{
	if (stack.top == 0)
	{
		return true; 
	}
	return false; 
}

//顺序栈中元素个数
int GetStackSize(SqStack& stack)
{
	return stack.top;  //栈顶位置即top的数值,就是栈中元素的个数
}

//判断栈满
bool StackFull(SqStack& stack)
{
	if (stack.top == MaxSize)   //top的位置值等于MaxSize时栈满
	{
		return true; 
	}
	return false; 
}

//顺序栈入栈,将数据存入stack.base[stack.top]所在的位置,然后stack.top的值加 1
bool PushStack(SqStack& stack, SElemType value)
{
	if (StackFull(stack))
	{
		cout << "栈满" << endl; 
		return false;  
	}
	//若栈未满,执行入栈操作
	stack.base[stack.top] = value;    //以栈顶位置作为下标存储数据
	stack.top++;		//栈顶自增一
	return true; 
}

//顺序栈出栈
//将stack.top的值减1,其位置便是栈最后一个数据元素所在位置。
bool PopStack(SqStack& stack, SElemType &value)
{
	if (StackEmpty(stack))
	{
		cout << "栈为空" << endl; 
		return false; 
	}
	stack.top--;	//栈顶自减 1
	value = stack.base[stack.top];	//以栈顶位置作为下标的值赋值给value返回
	return true; 
}

//获取顺序栈中元素
bool GetStack(SqStack& stack, SElemType& value)
{
	if (StackEmpty(stack))
	{
		cout << "栈为空" << endl;
		return false; 
	}
	value = stack.base[stack.top - 1];  //想象将栈顶下标减1后该位置的值赋值给value,并返回
	return true; 
}

void DeleteStack(SqStack& stack)
{
	if (stack.base)    //若栈底指针分配有地址,则释放
	{
		delete stack.base;  //释放栈底指针的地址
		stack.top = 0;		//令栈顶位置为0
		stack.base = NULL; //将栈底指针指向空
		cout << "栈已释放内存!" << endl; 
	}
}

int main()
{
	SqStack	stack;   //创建顺序栈
	//初始化顺序栈
	InitStack(stack);	
	//插入元素
	int number = 0;
	int value = 0;
	cout << "请输入需要插入的元素个数:";
	cin >> number;
	while (number > 0)
	{
		cin >> value;
		PushStack(stack, value);
		number--; 
	}
	//获取栈顶的元素
	GetStack(stack, value);
	cout << "当前栈顶的元素是:" << value << endl;

	//获取栈的元素个数
	cout << "当前栈的元素个数是:" << GetStackSize(stack) << endl;

	//出栈
	cout << "出栈顺序:" << endl;
	while (!StackEmpty(stack))
	{
		PopStack(stack, value);
		cout << value << " ";
	}
	//释放栈的内存
	DeleteStack(stack);
	system("pause");
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蒸汽流量计量表

数字化场景&#xff1a;蒸汽监测 定义 监测蒸汽流量 单位是 立方米 很难计算 等效碳排 不是按楼&#xff0c;也不是按层&#xff0c;比如宁波某园区&#xff0c;就6个蒸汽流量表 看懂蒸汽表&#xff0c;了解蒸发焓或潜热(hfg) 由于水是从0C加热到饱和温度的&#xff0c;它…

一招告别百度广告烦恼,同时效率提高100倍的几个常用搜索技巧!

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐--…

制作企业期刊的必备工具,这个很强!

制作企业期刊是一项重要的任务&#xff0c;它不仅可以帮助企业展示自己的品牌形象&#xff0c;还可以促进内部员工的交流和合作。为了制作出一份高质量的企业期刊&#xff0c;你需要一些必备的工具。今天&#xff0c;给大家分享一款实用的工具-------FLBOOK在线制作电子杂志平台…

记忆化搜索

记忆化搜索 在递归过程中&#xff0c;有许多分支被反复计算&#xff0c;会大大降低算法的执行效率。用记忆搜索&#xff0c;讲已经计算出来的结果保存起来&#xff0c;以后需要用到直接去除结果&#xff0c;避免重复运算。 题目链接 数不清的数 原本的代码 外面一层t的whil…

【献给过去的自己】栈实现计算器(C语言)

背景 记得在刚学C语言时&#xff0c;写了一篇栈实现计算器-CSDN博客文章。偶然间看到了文章的阅读量以及评论&#xff0c;居然有1.7w的展现和多条博友的点评&#xff0c;反馈。 现在回过头来看&#xff0c;的确有许多不严谨的地方&#xff0c;毕竟当时分享文章时&#xff0c;还…

SAP PI/PO中使用UDF解决按字节拆分字符串的需求

需求背景&#xff1a; SAP需要将采购订单信息通过PI发送到SFTP服务器上&#xff0c;生成文件&#xff0c;一般对日项目上文件内容通常都是按照指定的字节数拆分的&#xff0c;而不是字符数&#xff0c;类似下面的格式。 问题点&#xff1a; 如果是使用FTP适配器&#xff0c;则…

教你简单几步,轻松下载微信视频号里的视频

在如今社交媒体上&#xff0c;视频内容越来越受到人们的喜爱。微信视频号作为一个新兴平台&#xff0c;以其丰富的视频内容吸引着越来越多的用户。然而&#xff0c;许多人在观看完喜欢的视频后&#xff0c;都希望能够将其下载到本地进行保存或分享。那么&#xff0c;微信视频号…

联想领像M102W激光打印机报错E0问题的描述

速印机(理想、荣大等)、复印机(夏普、东芝、理光、佳能、震旦等全系列)、打印机、扫描仪、传真机、多媒体教学一体机、交互式电子白板、报警器材、监控、竞业达监考设备及其它监考设备、听力考试设备、特种安防设备维护及维修。 联想领像M102W打印机是理光SP系列的衍生机器…

gamingtcui.dll 丢失的全面解决方案指南,快速修复gamingtcui.dll文件

在使用计算机进行工作或娱乐时&#xff0c;我们可能会遇到一些需要技术解决的问题。其中&#xff0c;"gamingtcui.dll找不到"是一种比较常见的DLL文件相关的问题&#xff0c;许多用户在面对它时会感到疑惑&#xff0c;首先&#xff0c;我们需要理解问题的本质 —— 什…

《洛谷深入浅出进阶篇》P1995 程序自动分析——并查集,离散化

上链接&#xff1a;P1955 [NOI2015] 程序自动分析 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1955 上题干&#xff1a; 首先给你一个整数t&#xff0c;代表t次操作。 每一次操作包含以下内容&#xff1a; 1.给你一个整数n&#xff0c;让…

挖掘PostgreSQL事务的“中间态”----更加严谨的数据一致性?

1.问题 今天在上班途中&#xff0c;中心的妹纸突然找我&#xff0c;非常温柔的找我帮忙看个数据库的报错。当然以我的性格&#xff0c;妹子找我的事情对我来说优先级肯定是最高的&#xff0c;所以立马放下手中的“小事”&#xff0c;转身向妹子走去。具体是一个什么样的问题呢…

这才是 SpringBoot 统一登录鉴权、异常处理、数据格式的正确打开姿势

本篇将要学习 Spring Boot 统一功能处理模块&#xff0c;这也是 AOP 的实战环节 用户登录权限的校验实现接口 HandlerInterceptor WebMvcConfigurer 异常处理使用注解 RestControllerAdvice ExceptionHandler 数据格式返回使用注解 ControllerAdvice 并且实现接口 Response…

阿尔法狗的算法解析-增强学习和蒙特卡洛树搜索算法

阿尔法狗(AlphaGo)是谷歌旗下DeepMind开发的一个著名的增强学习算法,它在围棋领域取得了显著的成就。本文主要探讨其中两个重要的算法:增强学习算法和蒙特卡洛树搜索算法。 AlphaGo涉及的算法 AlphaGo是DeepMind团队开发的一个由多种算法和技术组合而成的系统,其包括以下…

【Linux网络】典型NAS存储方式:NFS网络共享存储服务

一、关于存储的分类 二、NFS的介绍 nfs的相关介绍&#xff1a; 1、原理 2、nfs的特点 3、nfs软件学习 4、共享配置文件的书写格式 关于权限&#xff0c;学习&#xff1a; 5、关于命令的学习&#xff1a; 三、实验操作 1、nfs默认共享权限&#xff08;服务端设置&#…

大数据-之LibrA数据库系统告警处理(ALM-12049 网络读吞吐率超过阈值)

告警解释 系统每30秒周期性检测网络读吞吐率&#xff0c;并把实际吞吐率和阈值&#xff08;系统默认阈值80%&#xff09;进行比较&#xff0c;当检测到网络读吞吐率连续多次&#xff08;默认值为5&#xff09;超过阈值时产生该告警。 用户可通过“系统设置 > 阈值配置 >…

【数据结构】C语言实现栈

&#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;C/C领域新星创作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;数据结构与算法&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;大家…

软件开发和软件测试,到底学哪个好呢?

写在前面&#xff1a;买车没有最好&#xff0c;只有最适合。 类似这类“很难选择”的问题&#xff0c;在知乎上其实有很多。 比如&#xff1a;“该去年薪10w的国家电网&#xff0c;还是去年薪40w的互联网大厂”&#xff1b; 比如&#xff1a;“城里有房&#xff0c;剩下的100…

Sentinel规则

一、服务熔断测试 例子: application.properties配置文件 server.port8083spring.application.nameorder#spring.cloud.nacos.discovery.server-addrhttp://192.168.44.64:80spring.cloud.nacos.discovery.server-addrlocalhost:8848spring.cloud.sentinel.transport.port999…

C++之map和set模拟实现

前言 在map和set的使用文章中提到了CSTL中的map和set的底层其实就是用的红黑树来实现的,所以可以用红黑树来简单模拟实现一下STL中的map和set. STL源码中map和set的实现 map: 我们看到它的底层这个成员变量其实就是一棵红黑树, 之前说过map其实就对应搜索树的KV模型&#x…

面向企业的人脸属性检测技术方案

人脸识别技术已经成为企业提升服务质量、优化用户体验的重要工具。美摄科技&#xff0c;作为领先的人工智能技术提供商&#xff0c;我们致力于为企业提供最先进、最全面的人脸属性检测技术解决方案。 我们的AI人脸检测与属性分析技术&#xff0c;能够快速准确地检测人脸并返回…