C++数据结构-栈

目录

    • 顺序栈
    • 链栈

栈是允许在表的一端进行插入和删除的线性表。表中允许插入删除的一端是栈顶,栈顶的当前位置是动态变化的;不允许插入和删除的一端是栈底,栈底的位置是不变的。当表中没有元素时称为空栈,插入数据的运算称为进栈、压栈、入栈,删除数据的运算称为出栈或退栈。

进/出栈示意图:
在这里插入图片描述进栈的顺序是e1、e2、e3,出栈的顺序为e3、e2、e1,所以栈又称为后进先出线性表(Last In First Out),简称LIFO表,或称先进后出线性表。其特点是先进后出或者后进先出。

顺序栈

栈的存储与一般的线性表的存储类似,主要有两种存储方式:顺序存储和链式存储。

利用顺序存储方式实现的栈称为顺序栈。类似于顺序表的定义,要分配一块连续的存储空间存放栈中的元素,栈底位置可以固定地设置在数组的任何一端(一般在下标为0的一端),而栈顶是随着插入和删除而变化的,再用一个变量指明当前栈顶的位置(实际上是栈顶元素的下一个位置)。

在这里插入图片描述顺序栈的类描述如下:

// 学生表
struct Student
{int					id_;		// 学生idstd::string			name_;		// 学生姓名int					score_;		// 学生成绩Student(int _id, std::string _name, int _score): id_(_id), score_(_score), name_(_name){}Student(): id_(0), score_(0){}
};class Stack
{
public:Stack(int _stackSize = 100);~Stack();bool IsEmptyStack();	// 判断栈是否为空bool PushStack(Student &_stu);		// 入栈bool PopStack(Student &_stu);		// 出栈bool GetTop(Student& _stu);			// 取栈顶元素private:Student* base_;	// 栈底指针Student* top_;	// 栈顶指针int size_;		// 栈的大小
};

(1)判断栈是否为空

算法思想:判断top_是否小于等于base_,如果小于等于说明是空栈,返回true,否则返回false。

bool Stack::IsEmptyStack()
{if (top_ <= base_)return true;return false;
}

(2)入栈操作

算法描述:入栈操作是在栈的顶部进行插入操作,相当于在顺序表的表尾进行插入,因而无须移动元素。

算法思想:首先判断栈是否已满,若满则失败,返回0;否则,由于栈的top 指向栈顶元素的后一个位置,将入栈元素赋到top的位置,再将top+1指向新的位置,成功返回1。

bool Stack::PushStack(Student& _stu)
{if (top_ - base_ < size_){*top_ = _stu;top_++;return true;}return false;
}

(3)出栈操作

算法描述:出栈操作是在栈的顶部进行,相当于是删除顺序表的最后一个元素,所以也不需要移动元素。

算法思想:首先判断栈是否为空,若空则失败,返回false;否则,由于栈的top 指向栈顶元素的后一位置,要先修改top为top-1,再将其所指向的元素以引用参数_stu返回,成功返回true。

bool Stack::PopStack(Student& _stu)
{if (top_ > base_){top_--;_stu = *top_;return true;}return false;
}

(4)取栈顶元素

算法描述:取栈顶元素是获取出栈顶元素的值,而不改变栈。

算法思想:首先判断栈是否为空,若空则失败,返回0;否则,由于栈的top 指向栈顶元素的后一位置,返回top-1所指单元的值,栈不发生变化。

bool Stack::GetTop(Student& _stu)
{if (top_ <= base_)return false;_stu = *(top_ - 1);return true;
}

链栈

栈也可以用链式存储方式实现。一般链栈用单链表表示,其结点结构与单链表的结构相同,即结点为:

// 学生表
struct Student
{int					id_;		// 学生idstd::string			name_;		// 学生姓名int					score_;		// 学生成绩Student(int _id, std::string _name, int _score): id_(_id), score_(_score), name_(_name){}Student(): id_(0), score_(0){}
};//定义链栈的结点
class StackNode                        
{
public:Student data;StackNode* next;StackNode(){next = NULL;};
};

因为栈中的主要运算是在栈顶进行插入和删除操作,显然在单链表的表头插入和删除都比较方便,因此以其作为栈顶,而且没有必要像单链表那样为了运算方便而附加一个头结点,存储结构如图:

在这里插入图片描述思考:为什么不用单链表的表尾作为栈顶?

因为用表尾作为栈顶,那么每次进行入栈、出栈、取栈顶元素的操作都需要遍历一遍单链表找到表尾,或者声明尾指针指向表尾,但是这样做太复杂,没有必要。

// 链栈
class LinkStack
{
public:LinkStack();~LinkStack();bool Empty_Stack();							//判断栈是否为空bool Push_Stack(Student e);					//将元素e插入栈顶bool Pop_Stack(Student& e);					//从栈顶删除一个元素到e中返回bool GetTop_Stack(Student& e);				//从栈顶取出一个元素到e中返回private:StackNode* top_;};            

(1)判断链栈是否为空

bool LinkStack::Empty_Stack()
{return (top_ == nullptr);
}

(2)入栈操作

入栈操作相当于是在表头插入一个元素

bool LinkStack::Push_Stack(Student e)
{StackNode* p = new StackNode;p->data = e;p->next = top_;top_ = p;return true;
}

(3)出栈操作

出栈操作相当于删除表头

bool LinkStack::Pop_Stack(Student& e)
{if (top_){StackNode* p = top_;e = p->data;top_ = p->next;delete p;p = nullptr;return true;}return false;
}

(4)取栈顶元素

bool LinkStack::GetTop_Stack(Student& e)
{if (top_){e = top_->data;return true;}return false;
}

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

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

相关文章

字符串与模拟法

加密英文 输入一个字符串可用getline(cin,数组名) 字典序 在字符串中寻找子字符串 分糖果 代码 猴子选大王 代码 如果n号猴子被选中&#xff0c;则使得n号的猴子变成false&#xff0c;未出局的猴子为true。 if(pn1) p1;这个是将超出的下标重新变回1号&#xff0c;使其重新循…

PromQL语法

PromQL&#xff08;Prometheus Query Language&#xff09;是 Prometheus 内置的数据查询语言&#xff0c;它能实现对事件序列数据的查询、聚合、逻辑运算等。它被广泛应用在 Prometheus 的日常应用当中&#xff0c;包括对数据查询、可视化、告警处理当中。简单地说&#xff0c…

易趋产品升级(EasyTrack 11_V1.3) | 集成飞书、WPS、个性化设置,增强团队协作和用户体验

企业在项目管理过程中&#xff0c;经常会遇到项目信息同步不及时、沟通障碍以及管理软件使用不便捷等难题&#xff0c;导致团队协作效率低下。这种情况下&#xff0c;如果使用了多个办公软件&#xff08;如&#xff1a;钉钉、企业微信、项目管理软件等&#xff09;&#xff0c;…

35--JDK新特性

1、新语法结构 新的语法结构&#xff0c;为我们勾勒出了 Java 语法进化的一个趋势&#xff0c;将开发者从复杂、繁琐的低层次抽象中逐渐解放出来&#xff0c;以更高层次、更优雅的抽象&#xff0c;既降低代码量&#xff0c;又避免意外编程错误的出现&#xff0c;进而提高代码质…

【VB测绘程序设计】案例6——华氏温度与摄氏温度之间的转换程序(附源代码)

【VB测绘程序设计】案例6——华氏温度与摄氏温度之间的转换程序(附源代码) 文章目录 前言一、界面显示二、程序说明三、程序代码1程序变换2程序变换四、数据演示总结前言 本文主要掌握Val()函数以及String数据类型的应用,通过2个text来输入数据,2个Command控件来执行转换…

Java——功能开发思路

目录 前言一、准备工作—准备各类文件1、准备实体类、枚举类、常量类2、准备配置文件 二、先编写Controller三、再编写Service、serviceImpl四、再编写mapper后续敬请期待 前言 Java开发功能简单思路 一、准备工作—准备各类文件 提前知道需要用到哪些类可以提前准备好&#…

智能客服系统要素分析:提升客户满意度与工作效率的关键要素

智能客服系统是企业建立完善服务框架的重要工具。市面上存在着形态各异的各种客服系统&#xff0c;如何选择一款最适合自己企业的产品是很多采购人员想知道的问题。事实上&#xff0c;不同的智能客服系统之间的主要功能并未存在太大的区别&#xff0c;它们往往会在一些亮点功能…

09 标准库软件模拟I2C时序

引言&#xff1a; 你需要的I2C知识这里都有&#xff0c; 本文涵盖了I2C的基本知识和在各个主流平台的开发实例&#xff0c; 总之&#xff0c; 你需要的&#xff0c;都在这里&#xff0c; 后续我也会继续更新在嵌入式开发中常见的通信协议。 一、I2C的基本知识 1. I2C介绍 IIC总…

留言板(Mybatis连接数据库版)

目录 1.添加Mybatis和SQL的依赖 2.建立数据库和需要的表 3.对应表中的字段&#xff0c;补充Java对象 4.对代码进行逻辑分层 5.后端逻辑代码 之前的项目实例【基于Spring MVC的前后端交互案例及应用分层的实现】https://blog.csdn.net/weixin_67793092/article/details/134…

HTTPS协议详解

目录 前言 一、HTTPS协议 1、加密是什么 2、为什么要加密 二、常见加密方式 1、对称加密 2、非对称加密 三、数据摘要与数据指纹 1、数据摘要 2、数据指纹 四、HTTPS加密策略探究 1、只使用对称加密 2、只使用非对称加密 3、双方都使用非对称加密 4、对称加密非…

html-css-js使用axios和ajax获取接口并携带请求头+获取输入框或选择器内容

需求&#xff1a;使用axios或者Ajax获取接口&#xff0c;有些需要获取到输入框&#xff0c;或者选择器内容之后传给接口&#xff0c;也就是写了几种不同请求的方法&#xff0c;网上有很多方法&#xff0c;本文章算是个归纳吧。 一、axios请求传参请求头 1.github下载axios 我…

MS2358:96KHz、24bit 音频 ADC

产品简述 MS2358 是带有采样速率 8kHz-96kHz 的立体声音频模数 转换器&#xff0c;适合于面向消费者的专业音频系统。 MS2358 通过使用增强型双位 Δ - ∑ 技术来实现其高精度 的特点。 MS2358 支持单端的模拟输入&#xff0c;所以不需要外部器 件&#xff0c;非常适…

领域驱动设计(Domain-Driven Design DDD)——模型驱动设计的构造块2

书接上回领域驱动设计&#xff08;Domain-Driven Design DDD)——模型驱动设计的构造块1-CSDN博客 四、领域对象的生命周期 每个对象都有生命周期&#xff0c;管理这些对象面临诸多挑战&#xff0c;主要的挑战有以下两类。 在整个生命周期中维护完整性 防止模型陷入管理…

内侧APP分发平台:移动应用开发的加速器

在数字化时代&#xff0c;移动应用已成为企业触达用户的重要渠道。为了迅速占领市场&#xff0c;开发者需要一种能够快速发布和测试移动应用的解决方案。内侧APP分发平台应运而生&#xff0c;它通过简化应用的封装、测试和分发流程&#xff0c;极大地提升了移动应用的上市速度。…

【大数据面试知识点】Spark中的累加器

Spark累加器 累加器用来把Executor端变量信息聚合到Driver端&#xff0c;在driver程序中定义的变量&#xff0c;在Executor端的每个task都会得到这个变量的一份新的副本&#xff0c;每个task更新这些副本的值后&#xff0c;传回driver端进行merge。 累加器一般是放在行动算子…

12. 整数转罗马数字

罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 …

第14课 多维数组

文章目录 前言一、多维数组的定义二、多维数组的初始化三、多维数组的使用&#xff08;以二维数组为例&#xff09;1. 矩阵转置问题 三、课后练习1. 求一个m*n矩阵中所有元素的累加和2. 查找并输出一个m*n矩阵中的最小元素以及其在矩阵中的位置3. 将m*n矩阵A复制为m*n矩阵B&…

leetcode 贪心(分发糖果、K次取反后最大化的数组和、加油站)

1005.K次取反后最大化的数组和 给定一个整数数组 A&#xff0c;我们只能用以下方法修改该数组&#xff1a;我们选择某个索引 i 并将 A[i] 替换为 -A[i]&#xff0c;然后总共重复这个过程 K 次。&#xff08;我们可以多次选择同一个索引 i。&#xff09; 以这种方式修改数组后…

Linux报错:audit: backlog limit exceeded

今天&#xff0c;一台虚拟机上操作昨天打开的连接一直没响应&#xff0c;新打开连接连接不上。SSH校验不通过。 通过IT的后台&#xff0c;可以看到满屏的audit: backlog limit exceeded。 问题原因&#xff1a;audit服务记录的审计事件超出默认(或设置)数量 &#xff0c;达到或…

边缘计算网关在温室大棚智能控制系统应用,开启农业新篇章

项目需求 ●目前大棚主要通过人为手动控温度、控水、控光照、控风&#xff0c;希望通过物联网技术在保障产量的前提下&#xff0c;提高作业效率&#xff0c;降低大棚总和管理成本。 ●释放部分劳动力&#xff0c;让农户有精力管理更多大棚&#xff0c;进而增加农户收入。 ●…