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;
}
运行结果:
按顺序放入元素1、2、3后,目前栈里的元素: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;
}
运行结果:
按顺序放入字符1、2、3后,目前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;
}
运行结果:
按顺序放入字符1、2、3后,目前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
至此,栈的基本使用就学完啦
是不是很简单呢?
刚接触肯定会觉得难,多些做题多些用,熟悉了就容易了,兄弟萌,加油!!!
文章尚有不足,欢迎大牛们指正
感谢观看,点个赞吧