news 2026/1/12 7:49:09

STL专项:stack 栈

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STL专项:stack 栈

本文章是学习过程中记录的笔记,主要来源Erik_Tse

stack

stack是栈,一种后进先出(Last In First Out)的容器,它仅维护栈顶(top),支持入栈(push),查询栈顶(top),出栈(pop),查询大小(size)操作。

常用于"单调栈","括号匹配","dfs","Tarjan求强连通分量","波兰表达式(计算器)"等算法或数据结构中。

初始化

stack<int> stk;//创建一个空栈,栈不允许列表初始化或填充相同元素

//但是可以从已有的栈进行拷贝构造

stack<int> stk2(stk);

stack<int> stk3 = stk2;

入栈

stk.push(10);//stk = [10(top)]

stk.push(20);//stk = [10,20(top)]

stk.push(50);//stk = [10,20,50(top)]

cout << stk.top() << '\n';//50, stk = [10,20,50(top)]

stk.pop();//stk = [10,20(top)]

cout << stk.top() << '\n';//20, stk = [10,20(top)]

取出栈顶元素

//c++top()只会取出栈顶元素,不会将栈顶元素pop()

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

出栈

//弹出栈顶元素,注意判断非空!

if(stk.size()) {

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

stk.pop();

}

获取栈大小(元素个数),判空

cout << stk.size() << '\n';

if(stk.empty()) ...//栈空

清空栈

while(stk.size()) stk.pop();//O(n)

手写栈

//stack中不允许遍历,但是我们可以用手写栈或者用vector,就可以实现遍历啦

//手写栈,只需要用top表示栈顶下标,以下标1作为栈底即可

int stk[N],top=0;

//入栈

stk[++ top] =x;

//出栈

top --;

//取出栈顶元素

cout << stk[top] << '\n';

//获取大小

cout << top << '\n';

//判断是否为空

if(top) ...//非空

//遍历栈

for(int i=1;i<=top;i++)

//甚至还可以在单调栈上进行二分

练习题(火车)

火车轨道 | 星码StarryCoding 算法竞赛新手村

答案代码

#include<bits/stdc++.h> using namespace std; int main(){ int n;cin>>n; stack<int> stk; int need=1; for(int i=1;i<=n;i++){ int x;cin>>x; stk.push(x); while(stk.size()&&need<=n&&stk.top()==need){ need++; stk.pop(); } } if(need==n+1) cout << "Yes" << '\n'; else cout << "No" << '\n'; return 0; }

注意一点——在 while 循环的条件判断部分,需要先判空,再去取栈顶元素,否则如果为空,但是已经取出栈顶元素了,这是非法操作,不会再进行后续操作(程序崩溃了)

练习题(括号匹配)

括号匹配 | 星码StarryCoding 算法竞赛新手村

答案代码

#include<bits/stdc++.h> using namespace std; const int N = 2e5+9; char s[N]; void solves(){ cin>>s+1; int n=strlen(s+1); stack<char> stk; bool ans=true; for(int i=1;i<=n;i++){ if(s[i]=='('||s[i]=='['||s[i]=='{'){ stk.push(s[i]); }else{ if(stk.empty()){ ans=false; break; }else{ if((stk.top()=='('&&s[i]==')')|| (stk.top()=='['&&s[i]==']')|| (stk.top()=='{'&&s[i]=='}')){ stk.pop(); }else{ ans=false; break; } } } } if(stk.size()) ans=false; cout<<(ans?"YES":"NO")<<'\n'; } int main(){ int _;cin>>_; while(_--){ solves(); } return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/10 20:56:25

STL专项:priority_queue 优先队列(堆)

priority_queue 优先队列&#xff0c;也叫"堆"&#xff0c;仅维护最大/最小元素&#xff0c;可以在较小的时间复杂度内获取某个元素集合的最大或最小值 优先队列常用于贪心、优化dp、构造、dijkstra、prim等问题或算法中&#xff0c;应用非常广泛 声明 //默认为大根堆…

作者头像 李华
网站建设 2026/1/8 21:21:43

三维动态避障路径规划:山羊优化算法(Goat Optimization Algorithm, GOA)融合动态窗口法DWA的无人机三维动态避障方法研究,MATLAB代码

针对无人机在三维动态环境下路径规划存在的实时性差、避障精度低、路径平滑性不足等问题&#xff0c;提出一种山羊优化算法&#xff08;Goat Optimization Algorithm, GOA&#xff09;混合的路径规划方法。首先&#xff0c;利用山羊优化算法GOA完成全局路径的离线规划&#xff…

作者头像 李华
网站建设 2026/1/9 6:34:16

YOLO在电磁辐射监测的应用:基站设备视觉识别

YOLO在电磁辐射监测的应用&#xff1a;基站设备视觉识别 在城市楼宇之间穿梭的无人机缓缓升空&#xff0c;镜头扫过密布的通信铁塔与屋顶天线阵列。这些看似静默的设备背后&#xff0c;是5G时代高速数据流动的神经末梢&#xff0c;也是公众日益关注的电磁辐射源。如何在成百上千…

作者头像 李华
网站建设 2026/1/11 6:00:56

YOLO模型训练资源使用报表:月度统计与成本分摊

YOLO模型训练资源使用报表&#xff1a;月度统计与成本分摊 在智能制造车间的视觉质检线上&#xff0c;一台搭载YOLOv8的边缘设备正以每秒150帧的速度识别PCB板上的焊点缺陷&#xff1b;与此同时&#xff0c;在企业AI中心的GPU集群中&#xff0c;数十个基于YOLOv10的训练任务正在…

作者头像 李华
网站建设 2026/1/12 2:26:25

Gopher协议:从互联网先驱到SSRF利刃的演进之路

1 概述&#xff1a;互联网的“化石级”协议Gopher协议是互联网早期基于文本的信息查找系统&#xff0c;由美国明尼苏达大学于1991年设计并命名&#xff0c;其名称源自该校“金色地鼠”运动队的俚语缩写。在万维网诞生之前&#xff0c;Gopher曾是互联网上最主要的信息检索工具&a…

作者头像 李华
网站建设 2026/1/9 5:05:51

YOLO目标检测中的小目标识别难题破解思路

YOLO目标检测中的小目标识别难题破解思路 在工业质检、无人机巡检和自动驾驶等真实场景中&#xff0c;我们常常面临一个令人头疼的问题&#xff1a;那些微小的目标——比如PCB板上的焊点缺陷、高空航拍图中的行人、或是显微图像里的细胞结构——总是难以被准确捕捉。尽管YOLO系…

作者头像 李华