Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[C++STL教程]3.stack栈入门简明教程,小白都能理解~

[C++STL教程]3.stack栈入门简明教程,小白都能理解~

原创
作者头像
Eriktse
发布于 2023-03-16 12:46:55
发布于 2023-03-16 12:46:55
4740
举报
文章被收录于专栏:编程技巧编程技巧

在学习之前,先了解一下什么是stack

std::stack 类是容器适配器,它给予程序员栈的功能——特别是 FILO (先进后出)数据结构

该类模板表现为底层容器的包装器——只提供特定函数集合。栈从被称作栈顶的容器尾部推弹元素。

FILO指的是First In Last Out,也就是说第一个进来的,是最后一个出去的。我们可以将stack理解为一个上端开口的铁箱子,我们可以从顶部拿出物品或放入物品,且记录物品个数。

stack仅维护一个栈顶,意味着我们只能从一端对数据进行操作。

本文仅从入门和实用角度介绍queue的用法,主要针对初学者或竞赛向。如有不严谨的地方欢迎指正!

初始化

在使用stack之前,需要先引入头文件。

代码语言:c++
AI代码解释
复制
#include <stack>

初始化的语法如下:

代码语言:c++
AI代码解释
复制
stack<T> stk;// T 为数据类型

stack<int> stk_int;//声明一个栈,存放类型为int

和其他的stl容器一样,stack只能存放相同类型的元素,默认初始化为空栈。

入栈

stk.push(x)将元素x推入栈stk的栈顶,复杂度O(1)

每入栈一个新元素,会使得栈的大小+1。

代码语言:c++
AI代码解释
复制
// 左边为栈顶
// stk: empty

stk.push(1);
// stk : 1

stk.push(5);
// stk : 5 1

还有一种方法是用emplace()函数进行入栈,两者差别可以暂时忽略。

代码语言:c++
AI代码解释
复制
stk.emplace(7);
// stk : 7 5 1

出栈

stk.pop()stk的栈顶元素弹出栈,复杂度O(1)

代码语言:c++
AI代码解释
复制
// stk : 7 5 1

stk.pop();
// stk : 5 1

stk.pop();

// stk : 1

在出栈时要注意栈是否为空,空栈不允许出栈。这和queue出队类似,感兴趣的可以看看这篇文章:https://www.eriktse.com/technology/1063.html

你问一个人“push”的反义词是什么?如果他回答“pop”那他一定是程序员。(答案也许是“pull”)

获取栈顶元素

语法:stk.top()可以获取栈顶元素,但是不会自动将栈顶元素弹出。需要自行pop()。复杂度O(1)

代码语言:c++
AI代码解释
复制
// stk : 7 5 1

cout << stk.top() << '\n';// 7

注意获取栈顶元素的时候也需要保证栈不为空,否则将导致错误!

获取栈的大小

语法:stk.size(),返回值为一个非负整数,当返回0时表示栈为空,复杂度O(1)

代码语言:c++
AI代码解释
复制
// stk : 1
cout << stk.size() << '\n';// 1

stk.push(9);
// stk : 9 1
cout << stk.size() << '\n';// 2

本文由eriktse原创,未经允许禁止转载!

判断栈是否为空

语法:stk.empty(),返回值为一个bool值,当返回true时表示栈为空,当返回值为false时表示栈非空。复杂度O(1)

代码语言:c++
AI代码解释
复制
// stk : 9 1
cout << st.empty() << '\n';// false
stk.pop(), stk.pop();
// stk : empty
cout << st.empty() << '\n';// true

当然你也可以用stk.size() == 0来判断栈是否为空。

清空栈

和清空queue类似,stack没有clear()函数,但是可以通过多种办法来实现。

代码语言:c++
AI代码解释
复制
//方法一:只要栈不为空就一直弹出,直到为空
while(!stk.empty())stk.pop();

//方法二:直接赋值一个新的stack,默认为空栈
stk = stack<int>();

交换栈

语法:stk1.swap(stk2),返回值为void(),复杂度O(1)

代码语言:c++
AI代码解释
复制
stack<int> s, t;
s.emplace(1);
t.emplace(2);
cout << s.top() << '\n';// 1
s.swap(t);
cout << s.top() << '\n';// 2

常用函数总结

  • push(x)将元素x入栈
  • emplace(x)在栈顶构造元素x,并入栈(可以简单理解push()和emplace()差别不大)
  • pop()无参数,将栈顶元素弹出
  • size()返回栈的大小(元素个数)
  • empty()返回bool值表示栈是否为空
  • stk1.swap(stk2)交换两个栈

补充知识

栈在处理一些问题的时候非常好用,比如在做深度优先搜索dfs的时候,需要需要用到栈的思想,其中节点的遍历顺序可以用栈顺序表示。

同时利用栈可以构造一些特殊的数据结构比如单调栈从而求出一些特殊的东西,比如最大上升/下降子序列,从而优化一些dp问题。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
单调栈(C/C++)
单调队列和单调栈都是一种数据结构,应用十分广泛,在蓝桥杯、ICPC、CCPC等著名编程赛事都是重点的算法,今天博主将自己对单调栈与单调队列的理解以及刷题的经验,用一篇博客分享给大家,希望对大家有所帮助,它们用于解决类似“寻找最大值与最小值”这样的问题。它们的区别在于如何维护数据的单调性。、
摆烂小白敲代码
2024/09/23
1730
单调栈(C/C++)
stack实现二叉树的前序、中序和后序遍历
前序遍历的顺序为DLR,因此先将根结点进栈,当栈不为空:当前结点出栈,访问该结点->如果当前结点的右子树不为空则进栈->如果当前结点的左子树不为空则进栈。
Cyril-KI
2022/07/29
4280
典型的括号匹配问题c++
然后遍历字符串中的每个字符,在遍历过程中,如果是左括号,则将其加入栈中,如果是右括号,则弹出栈顶元素进行比较,如果不匹配则输出位置,匹配则弹出栈顶元素:
全栈若城
2024/02/29
3330
【CPP】《程序员面试金典》习题(3)——栈和队列
这次的题更少了,题目的主题是栈和队列,最值得注意的是活用两个栈可以组合完成很多事情。
ZifengHuang
2020/07/29
5720
算法学习笔记-栈(stack)
这题跟上面的题目是一模一样的,最少添加就是有多少括号没有对象,,没有对象的括号都会留在栈中,有的都会出栈,所以就是求栈的大小;
买唯送忧
2021/05/23
4510
LR--用栈实现移进--归约分析(demo)
E−&gt;E+EE-&gt;E+EE−>E+E E−&gt;E∗EE-&gt;E*EE−>E∗E E−&gt;idE-&gt;idE−>id
Enterprise_
2019/02/20
5680
C++STL容器stack
概念:stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口
CtrlX
2022/09/29
2760
C++STL容器stack
C++13-STL模板-栈stack
在线练习: http://noi.openjudge.cn/ https://www.luogu.com.cn/
IT从业者张某某
2023/10/16
2020
C++13-STL模板-栈stack
数据结构与算法面试题:实现二叉树的遍历(前序、中序、后序、层序)。
由于这是一道比较基础的二叉树问题,因此其实现思路也相对简单。但是在实际应用中需要灵活使用各种不同的遍历方式,并且代码的实现可能会涉及到栈和队列等相关数据结构。因此,熟悉常见的算法和数据结构、灵活掌握基础知识才是写好代码的关键。
GeekLiHua
2025/01/21
2120
计算任意的四则运算算式
记得去年刚上大一的时候,有一次实验课的作业就是做一个计算器。我当时就是想实现计算任意的四则运算表达式的功能。我依稀记得当时的实现非常的复杂,还用了正则表达式去匹配,获得相应的元素。但是当时没能实现处理括号的问题,只要不包含括号的算式,我当时都能解决。当时真的是想破脑袋都没想出来怎么解决这个问题。
灯珑LoGin
2022/10/31
5940
LR分析-demo2
0.LR分析 用一个栈来保存文法符号和状态的信息,一个字符串保存输入信息。 使用栈顶的状态符号和当前的输入符号来检索分析表,来决定移进-归约分析的动作。 1.样例文法 "E>E+T", "E>T",
Enterprise_
2019/02/20
4430
离散数学中求合取范式&析取范式
大二上学期时写的代码,用C++实现的。 #include <iostream> #include <cstdlib> #include <string> #include <stack> #include <vector> #include<math.h> using namespace std; //&表示合取,|表示析取,!表示非,>表示条件,=表示双条件 class ForBase { private: static const int MAXN = 92; int numVar; //记录
SuperHeroes
2018/05/30
2.2K0
LeetCode 151. 翻转字符串里的单词(栈)
无空格字符构成一个单词。 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
Michael阿明
2021/02/20
4020
LeetCode 151. 翻转字符串里的单词(栈)
米哈游面试算法题:有效的括号
描述:给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
GeekLiHua
2025/01/21
1950
二维动态规划——最大正方形与最大长方形
题目:https://onlinejudge.u-aizu.ac.jp/courses/library/7/DPL/3/DPL_3_A
灯珑LoGin
2022/10/31
2950
二维动态规划——最大正方形与最大长方形
剑指 Offer(C++版本)系列:剑指 Offer 06 从尾到头打印链表
同步GitHub在此 ? https://github.com/TeFuirnever/GXL-Skill-Tree 剑指 Offer(C++版本)系列:总目录和一些提高效率的说明 剑指 Offer(
我是管小亮
2021/07/20
3140
有效的括号(leetcode 20)
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
恋喵大鲤鱼
2022/09/27
2740
LeetCode 1209. 删除字符串中的所有相邻重复项 II(栈)
给你一个字符串 s,「k 倍重复项删除操作」将会从 s 中选择 k 个相邻且相等的字母,并删除它们,使被删去的字符串的左侧和右侧连在一起。
Michael阿明
2020/07/13
1.4K0
LeetCode 1209. 删除字符串中的所有相邻重复项 II(栈)
用javascript分类刷leetcode17.栈(图文视频讲解)4
目录Stack的特点:先进后出(FILO)使用场景:十进制转2进制 函数调用堆栈js里没有栈,但是可以用数组模拟 42/2 42%2=0 21/2 21%2=1 10/2 10%2=0 5/2 5%2=1 2/2 2%2=0 1/2 1%2=1 stack: 0,1,0,1,0,1 res: 1 0 1 0 1 0 fn1(){fn2() } fn2(){ fn3()} fn3(){} fn1() stack:fn1,fn2,fn3栈的时间复杂度:入栈和出栈O
js2030code
2023/01/06
3750
接雨水、、
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
狼啸风云
2023/10/07
4060
接雨水、、
相关推荐
单调栈(C/C++)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档