c++ stack用法 入门必看 超详细-程序员宅基地

技术标签: 算法  c++  数据结构  

1、stack的作用

stack是一个比较简单易用的数据结构,其最大的特性就是先进后出。就好比一个桶,先放进出的数据就在底部,如果想要取出就先要把上面的数据取出,现在不懂没关系,看完本文就可以理解了。

stack适用于许多算法,比较常用的是单调栈算法,也可以用来计算算术表达式

2、stack的定义

stack<储存的类型> 容器名
如:
储存int型数据的栈 stack<int> s;
储存double型数据的栈 stack<double> s;
储存string型数据的栈 stack<string> s;
储存结构体或者类的栈 stack<结构体名> s;

当然也可以定义stack数组:
储存int型数据的栈 stack<int> s[n];
储存double型数据的栈 stack<double> s[n];
等等,n为数组的大小

3、stack常用的成员函数

//其实栈就这几个成员函数
empty() //堆栈为空则返回真 
pop() //移除栈顶元素 
push() //在栈顶增加元素 
size() //返回栈中元素数目 
top() //返回栈顶元素 

示例代码:

#include<iostream>//c++标准头文件,可以使用cout,cin等标准库函数 
#include<stack>//使用stack时需要的头文件 
using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,stack,map,set,vector,queue时都要使用
int main(){
    
	stack<int> s;//定义一个int类型的stack
	
	s.push(1);//往栈里放入一个元素1
	s.push(2);//往栈里放入一个元素2
	s.push(3); //往栈里放入一个元素3
	
	cout<<"按顺序放入元素1、2、3后,目前栈里的元素:1 2 3" <<endl;
	cout<<"s.size()="<<s.size()<<endl;//s.size()返回栈内元素的个数  
	cout<<"s.empty()="<<s.empty()<<endl; //判断栈是否为空,值为1代表空,0代表非空,用s.size()同样可以判断 ,s.size()的值为0就代表空的 
	cout<<"s.top()="<<s.top()<<endl;//查看栈顶的元素 
	cout<<endl;
	
	s.pop();//弹出栈顶元素 
	cout<<"s.pop()后,目前栈里的元素:1 2"<<endl;
	cout<<"s.size()="<<s.size()<<endl;
	cout<<"s.empty()="<<s.empty()<<endl; 
	cout<<"s.top()="<<s.top()<<endl;
	cout<<endl;
	
	
	s.pop();
	cout<<"s.pop()后,目前栈里的元素:1"<<endl;
	cout<<"s.size()="<<s.size()<<endl;
	cout<<"s.empty()="<<s.empty()<<endl; 
	cout<<"s.top()="<<s.top()<<endl;
	cout<<endl;
	 
	s.pop();
	cout<<"s.pop()后,目前的栈是空的"<<endl;
	cout<<"s.size()="<<s.size()<<endl;
	cout<<"栈是空的就不能用s.top()访问栈顶元素了" <<endl; 
	cout<<"s.empty()="<<s.empty()<<endl; 
	 
}

运行结果:

按顺序放入元素123后,目前栈里的元素:1 2 3
s.size()=3
s.empty()=0
s.top()=3

s.pop()后,目前栈里的元素:1 2
s.size()=2
s.empty()=0
s.top()=2

s.pop()后,目前栈里的元素:1
s.size()=1
s.empty()=0
s.top()=1

s.pop()后,目前的栈是空的
s.size()=0
栈是空的就不能用s.top()访问栈顶元素了
s.empty()=1

4、从stack到string

栈中的数据是不允许随机访问的,就是不能像数组那样用下标访问,也不能遍历栈内的元素,这是很局限的。实际上,我们经常使用的string类型就是一种栈结构,但是我们可以通过下标访问元素,我们可以看看

//string的栈相关的成员函数
empty() //堆栈为空则返回真 
pop_back() //移除栈顶元素 
push_back() //在栈顶增加元素 
size() //返回栈中元素数目 
back() //返回栈顶元素 

示例代码:

#include<iostream>//c++标准头文件,可以使用cout,cin等标准库函数 
#include<string>//string包括了一些字符串操作的库函数,但用string时是不用引入这个头文件的
using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,stack,map,set,vector,queue时都要使用
int main(){
    
	string s;//定义一个字符串
	
	s.push_back('1');//往栈里放入一个元素1
	s.push_back('2');//往栈里放入一个元素2
	s.push_back('3'); //往栈里放入一个元素3
	
	cout<<"按顺序放入字符1、2、3后,目前string里的元素:" ;
	for(int i=0;i<s.size();i++){
    
		cout<<s[i]<<' ';
	}
	cout<<endl; 
	cout<<"s.pop_back()="<<s.size()<<endl;//s.size()返回string内字符的个数  
	cout<<"s.empty()="<<s.empty()<<endl; //判断栈是否为空,值为1代表空,0代表非空,用s.size()同样可以判断 ,s.size()的值为0就代表空的 
	cout<<"s.back()="<<s.back()<<endl;//查看栈顶的元素 
	cout<<endl;
	
	s.pop_back();//弹出栈顶元素 
	cout<<"s.pop_back()后,目前string里的元素:";
	for(int i=0;i<s.size();i++){
    //可以通过下标随机访问元素 
		cout<<s[i]<<' ';
	}
	cout<<endl; 
	cout<<"s.size()="<<s.size()<<endl;
	cout<<"s.empty()="<<s.empty()<<endl; 
	cout<<"s.back()="<<s.back()<<endl;
	cout<<endl;
	
	
	s.pop_back();
	cout<<"s.pop_back()后,目前string里的元素:";
	for(int i=0;i<s.size();i++){
    
		cout<<s[i]<<' ';
	}
	cout<<endl; 
	cout<<"s.size()="<<s.size()<<endl;
	cout<<"s.empty()="<<s.empty()<<endl; 
	cout<<"s.back()="<<s.back()<<endl;
	cout<<endl;
	
	 
	s.pop_back();
	cout<<"s.pop_back()后,目前的string是空的"<<endl;
	cout<<"s.size()="<<s.size()<<endl;
	cout<<"string是空的就不能用s.back()访问栈顶元素了" <<endl; 
	cout<<"s.empty()="<<s.empty()<<endl; 
	 
}

运行结果:

按顺序放入字符123后,目前string里的元素:1 2 3
s.pop_back()=3
s.empty()=0
s.back()=3

s.pop_back()后,目前string里的元素:1 2
s.size()=2
s.empty()=0
s.back()=2

s.pop_back()后,目前string里的元素:1
s.size()=1
s.empty()=0
s.back()=1

s.pop_back()后,目前的string是空的
s.size()=0
string是空的就不能用s.back()访问栈顶元素了
s.empty()=1

5、从stack到vector

相信大家如果会vector的话就肯定会stack了,vector是stack的升级版,多了很多成员函数,像随机插入函数insert()等等,大家完全可以用vector替代stack的,如果您想学习vector,建议您去看我的另一篇文章
c++ vector用法 入门必看 超详细

下面简单介绍一下vector
它和string不同的是,string只能存储char类型的,而vector能存储所有类型的数据,想int、double、结构体、类等等

//vector的栈相关的成员函数
empty() //堆栈为空则返回真 
pop_back() //移除栈顶元素 
push_back() //在栈顶增加元素 
size() //返回栈中元素数目 
back() //返回栈顶元素 

示例代码:

#include<iostream>//c++标准头文件,可以使用cout,cin等标准库函数 
#include<vector>//使用vector时需要的头文件 
using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,stack,map,set,vector,queue时都要使用
int main(){
    
	vector<int> v;//定义一个int类型的stack
	
	v.push_back(1);//往vector里放入一个元素1
	v.push_back(2);//往vector里放入一个元素2
	v.push_back(3); //往vector里放入一个元素3
	
	cout<<"按顺序放入字符1、2、3后,目前vector里的元素:" ;
	for(int i=0;i<v.size();i++){
    //可以通过下标随机访问元素 
		cout<<v[i]<<' ';
	}
	cout<<endl; 
	cout<<"v.pop_back()="<<v.size()<<endl;//v.size()返回vector内元素的个数  
	cout<<"v.empty()="<<v.empty()<<endl; //判断栈是否为空,值为1代表空,0代表非空,用v.size()同样可以判断 ,v.size()的值为0就代表空的 
	cout<<"v.back()="<<v.back()<<endl;//查看栈顶的元素 
	cout<<endl;
	
	v.pop_back();//弹出栈顶元素 
	cout<<"v.pop_back()后,目前vector里的元素:";
	for(int i=0;i<v.size();i++){
    
		cout<<v[i]<<' ';
	}
	cout<<endl; 
	cout<<"v.size()="<<v.size()<<endl;
	cout<<"v.empty()="<<v.empty()<<endl; 
	cout<<"v.back()="<<v.back()<<endl;
	cout<<endl;
	
	
	v.pop_back();
	cout<<"v.pop_back()后,目前vector里的元素:";
	for(int i=0;i<v.size();i++){
    
		cout<<v[i]<<' ';
	}
	cout<<endl; 
	cout<<"v.size()="<<v.size()<<endl;
	cout<<"v.empty()="<<v.empty()<<endl; 
	cout<<"v.back()="<<v.back()<<endl;
	cout<<endl;
	
	 
	v.pop_back();
	cout<<"v.pop_back()后,目前的vector是空的"<<endl;
	cout<<"v.size()="<<v.size()<<endl;
	cout<<"vtring是空的就不能用v.back()访问栈顶元素了" <<endl; 
	cout<<"v.empty()="<<v.empty()<<endl; 
	 
}

运行结果:

按顺序放入字符123后,目前vector里的元素:1 2 3
v.pop_back()=3
v.empty()=0
v.back()=3

v.pop_back()后,目前vector里的元素:1 2
v.size()=2
v.empty()=0
v.back()=2

v.pop_back()后,目前vector里的元素:1
v.size()=1
v.empty()=0
v.back()=1

v.pop_back()后,目前的vector是空的
v.size()=0
vtring是空的就不能用v.back()访问栈顶元素了
v.empty()=1

至此,栈的基本使用就学完啦

是不是很简单呢?

刚接触肯定会觉得难,多些做题多些用,熟悉了就容易了,兄弟萌,加油!!!

文章尚有不足,欢迎大牛们指正

感谢观看,点个赞吧

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_52115456/article/details/127595817

智能推荐

旺旺老师JavaSE基础第一章(01)Java介绍-程序员宅基地

文章浏览阅读424次。视频地址:http://v.youku.com/v_show/id_XNjI3NjMzOTI4.html?f=20609548_旺旺老师javase

一天一天学 windows phone 控件 之 TextBox + PasswordBox (十六)_windows控件taxtbox password-程序员宅基地

文章浏览阅读1.8k次。先从 TextBox 控件 说起,TextBox控件是输入框,类似于html中的 标签,_windows控件taxtbox password

带有Spring Cloud Config和JHipster的Java微服务-程序员宅基地

文章浏览阅读100次。朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 如今,使用Java和Spring Boot开发微服务架构非常流行。 它绝对是Java生态系统中最受欢迎的组合之一。 如果需要任何证据,只需看看过去几年出现的所有类似框架:MicroProfile,Micronaut和Quar..._jhipster mvn jib

【软件安装】(十二)MATLAB R2023b完整安装教程(附安装包)_matlab2023b-程序员宅基地

文章浏览阅读6.9w次,点赞325次,收藏700次。一个愿意伫立在巨人肩膀上的农民......_matlab2023b

server启动故障:com.ibm.ws.exception.RuntimeError-程序员宅基地

文章浏览阅读1.3k次。问题描述:在做了配置变更之后,server启动不起来。还原配置,依然存在这启动故障。this is the log :[8/23/15 12:09:20:276 CST] 00000001 WsServerImpl E WSVR0009E: Error occurred during startupcom.ibm.ws.exception.RuntimeError: o..._关键点恢复期间捕捉到异常!com.ibm.ws.recoverylog.spi.internallogexception

云原生微服务架构实战精讲第六节 事务事件处理和项目实例_ext_delete_rows-程序员宅基地

文章浏览阅读618次。第15讲:什么是事务性消息模式第 14 课时介绍了事件驱动设计的基本概念,在使用了消息代理之后,应用中产生的事件以消息的形式进行发布,消息的消费者接收到事件并进行处理。如果消息代理可以在传递消息时提供至少有一次的保证性,那么只要消息被成功发布,就可以确保该消息对应的事件必定会得到处理。事务性消息(Transactional Messaging)的目的是保证数据的一致性。在示例应用中,当收到创建行程的请求之后,行程服务会把行程信息保存在关系型数据库中,同时发布表示行程已创建的事件 TripCreatedE_ext_delete_rows

随便推点

反病毒引擎设计-程序员宅基地

文章浏览阅读775次。反病毒引擎设计创建时间:2003-10-02文章属性:转载文章提交:NJUE (admin_at_ourmm.com)本文将对当今先进的病毒/反病毒技术做全面而细致的介绍,重点当然放在了反病毒上,特别是虚拟机和实时监控技术。文中首先介绍几种当今较为流行的病毒技术,包括获取系统核心态特权级,驻留,截获系统操作,变形和加密等。然后分五节详细讨论虚拟机技术:第一节简单介绍一下虚拟

此blog停止更新,请访问最新域名_域名访问升级紧急中拿笔记好-程序员宅基地

文章浏览阅读1w次。此blog停止更新,请访问最新域名 http://blog.lokizone.com_域名访问升级紧急中拿笔记好

角色控制器 (Character Controller)_charactercontroller-程序员宅基地

文章浏览阅读1.1w次,点赞8次,收藏23次。角色控制器 (Character Controller)一、简介角色控制器(Character Controller)主要用于对第三人称或第一人称游戏主角的控制。如果要创建类人角色,可使用角色控制器 (Character Controller)。这可以是第三人称游戏 (Third Person Platformer) 中的主角色、FPS 射击者或任何敌人角色。二、基本概念第三人称游戏中的这..._charactercontroller

SpringBean生命周期详解-程序员宅基地

文章浏览阅读9.2k次,点赞14次,收藏103次。SpringBean生命周期详解一、简述:Spring是我们每天都在使用的框架,Bean是被Spring管理的Java对象,是Spring框架最重要的部分之一,那么让我们一起了解一下Spring中Bean的生命周期是怎样的吧二、流程图我们先从宏观的角度看一下Spring的生命周期:![在这里插入图片描述](https://img-blog.csdnimg.cn/20201028174058916.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5_springbean生命周期详解

TWaver GIS制作穹顶之下的雾霾地图-程序员宅基地

文章浏览阅读210次。“我不满意,我不想等待,我也不再推诿,我要站出来做一点什么。我要做的事,就在此时,就在此刻,就在此地,就在此生”。自离职央视后,沉寂许久的知名记者、主持人柴静昨日携个人视频新作 《穹顶之下》宣告归来,并在短时间内引起广泛关注。生活在这个地球上,空气质量的好坏决定这我们的健康,每个人都希望能够呼吸新鲜空气,都希望抬起头看到的是蓝天和白云,而不是灰蒙蒙的雾霾。说到雾霾,我们用TWaver GIS实现..._twaver.controls.borderpane

揭开native event的面纱_nativeevent-程序员宅基地

文章浏览阅读2k次。 这是我的第3篇关与native event的随笔。第一篇对native event作了简介。第二篇报告一个BUG(MSVC TEAM说这是一个以知的BUG,可是在VC8Express里仍然存在)。这一篇我们看看native event是如何实现的,并且尝试解决我们遇到的BUG。 从VC7(Microsoft Visual C++ .NET (2002) )开始MSVC提供了native eve_nativeevent

推荐文章

热门文章

相关标签