c++ stack用法 入门必看 超详细

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

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

是不是很简单呢?

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

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

感谢观看,点个赞吧

  • 41
    点赞
  • 201
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旧林墨烟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值