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


    1、stack的作用

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

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

    2、stack的定义

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

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

    3、stack常用的成员函数

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

    示例代码:

    #include//c++标准头文件,可以使用cout,cin等标准库函数 
    #include//使用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
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    运行结果:

    按顺序放入元素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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    4、从stack到string

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

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

    示例代码:

    #include//c++标准头文件,可以使用cout,cin等标准库函数 
    #include//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
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    运行结果:

    按顺序放入字符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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    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() //返回栈顶元素 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    示例代码:

    #include//c++标准头文件,可以使用cout,cin等标准库函数 
    #include//使用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
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    运行结果:

    按顺序放入字符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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

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

    是不是很简单呢?

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

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

    感谢观看,点个赞吧

  • 相关阅读:
    Grok AI 是什么?
    spark向hadoop写入文件后,查路径为目录,无法查值
    Java反编译生成java文件
    当心,好好生活便是
    OPPO realme 真我 一加 刷机工具下载 ColorOS Upgrade Tool
    JVM之类加载子系统
    计算机视觉+人工智能面试笔试总结——深度学习基础题21~40
    Prometheus+Ansible+Consul实现服务发现
    docker 安装卸载及常用命令
    stretchly定时提醒软件
  • 原文地址:https://blog.csdn.net/weixin_52115456/article/details/127595817