栈(Stack)

概念:就像一个盒子一样,进去想出来就得等上面的先出去,也就是“先进后出”。

往往栈的功能有上面四种,下面我们手写一个栈来实现这四种功能来更好的理解一下。

模拟栈的实现:

#include<iostream>
#include<string>using namespace std;const int N = 100010;int stk[N], tt; //tt为栈顶指针,初始化为0 int main(){int n; //要进行几次操作 cin >> n;string op; //要进行的操作while (n --){cin >> op;if (op == "push"){int x; //需要入栈的数 cin >> x;stk[++ tt] = x;  }else if (op == "pop") tt --;else if (op == "empty") cout << (tt ? "NO" : "YES") << endl;else cout << stk[tt] << endl;} return 0;
}

模拟栈的实现,只需要控制栈顶指针tt即可。

如果想访问栈顶元素时,只需访问tt所指位置的元素即可。

想往栈添加元素,只需让tt加1,指向下一个位置,然后在该位置存数即可。

想删除栈顶元素,只需让tt减1,这个元素也就不在是栈顶元素,也就是被移出了栈。

判断栈是否为空,只需看tt是否为0即可。

当然比赛中我们直接调用STL库即可。

#include<stack> //头文件stack<int> s; //定义一个栈s.size(); //栈中元素的数量 s.empty(); //栈是否为空 s.push(); //将此元素压入栈 s.pop(); //弹出栈顶元素s.top(); //访问栈顶元素

队列

概念:就像排队一样,先来的人排在前面,后来的人只能排在队尾,先来的人可以先走,后来的人只能后走,也就是“先进先出”。

往往队列的功能有上面四种,下面我们手写一个队列来实现这四种功能来更好的理解一下。

#include<iostream>
#include<string>using namespace std;const int N = 100010;int q[N];
int hh, tt = -1; //hh为队头,tt为队尾 int main(){int n; //要进行的操作数 cin >> n;while (n --){string op;cin >> op; //要进行的操作if (op == "push"){int x; //要加入的数 cin >> x;q[++ tt] = x; }else if (op == "pop") hh ++;else if (op == "empty") cout << (hh <= tt ? "NO" : "YES") << endl;else cout << q[hh] << endl; }return 0;
}

模拟队列的实现,只需要控制队头hh和队尾tt即可。

如果想查询队头元素,只需查看hh所指地方值即可。

如果想添加一个元素,只需让tt加1,指向下一个位置,在该位置存数即可。

想删除元素,只需让hh加1,让他指向下一个元素,该元素也就删除了。

判断队列是否为空,只需看队头是否大于队尾即可。如果大于队尾则空,反之则不空。

接下来我们看STL库中的队列方法。

#include<queue>queue<int> q; //定义一个队列que.size(); //返回队列元素数量que.empty(); //返回队列是否为空que.push(); //加入队列que.pop(); //出队que.front(); //返回队首que.back(); //返回队尾

下面我们来看一道天梯赛L2难度的真题:

例题

一种自动包装机的结构如图 1 所示。首先机器中有 N 条轨道,放置了一些物品。轨道下面有一个筐。当某条轨道的按钮被按下时,活塞向左推动,将轨道尽头的一件物品推落筐中。当 0 号按钮被按下时,机械手将抓取筐顶部的一件物品,放到流水线上。图 2 显示了顺序按下按钮 3、2、3、0、1、2、0 后包装机的状态。


一种特殊情况是,因为筐的容量是有限的,当筐已经满了,但仍然有某条轨道的按钮被按下时,系统应强制启动 0 号键,先从筐里抓出一件物品,再将对应轨道的物品推落。此外,如果轨道已经空了,再按对应的按钮不会发生任何事;同样的,如果筐是空的,按 0 号按钮也不会发生任何事。
现给定一系列按钮操作,请你依次列出流水线上的物品。

分析

通过对题目的分析,我们发现只需要将轨道看成队列,框看成队列,然后模拟这个过程就可以。

代码

#include<iostream>
#include<queue>
#include<stack>using namespace std;const int N = 110;queue<char> q[N]; //轨道
stack<char> s; //筐
int n, m, smax;int main(){cin >> n >> m >> smax;for (int i = 1; i <= n; i ++) for (int j = 0; j < m; j ++){char c;cin >> c;q[i].push(c);}int x;while (cin >> x, x != -1){if (x == 0 && !s.empty()){ //注意需要判断一下是否为空,如果在为空状态下访问栈顶元素会报错cout << s.top();s.pop();}if (x > 0 && s.size() < smax && q[x].size()){s.push(q[x].front());q[x].pop();}else if (x > 0 && s.size() >= smax && q[x].size()){cout << s.top();s.pop();s.push(q[x].front());q[x].pop();}}return 0;
}

vector

概念:就像一个长度可变的数组一样,把他当成数组处理就可以。

STL库:

#include<vector>vector<int> v; //定义一个vectorv.push_back(item); //向v后加一个元素v.pop_back(); //删除v最后一个元素v.size(); //获取v中元素个数v.empty(); //判断v是否为空v.clear(); //清空v中的元素v[index]; //获取v中下标为index的元素O(1)v.begin(); //返回指向第一个元素的迭代器v.end(); //返回指向vector末尾(最后一个元素之后的那个位置)的迭代器v.front(); //返回第一个元素v.back(); //返回最后一个元素

set

概念:相当于是数学的集合,会对相同的元素进行去重处理并默认排序。

STL库:

#include<set>set<int>s; //定义一个sets.insert(); //插入一个元素 s.size(); //获取元素的个数s.empty(); //判断是否为空s.clear(); //清空ss.count(item); //返回s中item的数量,因为集合中的元素不能重复,因此只能返回0或1

map

概念:map是一个键值对,是一个映射关系,你可以理解为帮你封装好了的hash表,通过键访问你的值。

STL库:

#include<map>map<int,int> mp; //定义一个mapmp.size(); //获取元素个数mp.empty(); //判断是否为空mp.clear(); //清空mpmp[key]=tmp; //可以把键值对key—value中的value赋值为tmp,如果没有对应的键值对,则将该键值对插入到map中

算法竞赛常用STL库相关推荐

  1. FM算法以及常用python库

    FM算法以及常用python库 Factorization Machines: 适用于高维稀疏数据集进行特征组合,发现特征隐藏信息.在CTR,推荐系统中用的很多,这些情况下我也没有用过. 通过目标函数 ...

  2. 算法竞赛常用OJ食用指南

    前言 在准备像ICPC.CCPC.蓝桥杯之类的算法竞赛时,学习完相应的知识点后往往需要大量刷题来巩固,一个OJ的好坏程度我认为可以根据以下几个方面来评定: 1.题目的质量 2.题解的质量 3.比赛的质 ...

  3. C++常用STL库详细总结

    C++STL库函数总结 #include< algorithm >库函数 1.sort排序 2.reverse倒转 3.unique去重 4.二分查找 5.find函数查找 6.字符串和整 ...

  4. ACM竞赛常用STL(二)之STL--algorithm

    <algorithm>无疑是STL 中最大的一个头文件,它是由一大堆模板函数组成的. 下面列举出<algorithm>中的模板函数: adjacent_find / binar ...

  5. 算法竞赛:Online Judge介绍

    专栏:算法竞赛 上一篇: 下一篇: 文章目录 一.什么是Online Judge 二.Online Judge 网站 1. 洛谷 2. LeetCode 力扣 3. 牛客 4. PTA 拼题A 三.算 ...

  6. 直播 | SemEval-2020自由文本关系抽取冠军方案解读(附NLP竞赛常用技巧总结)

    「PW Live」是由 PaperWeekly 和 biendata 共同发起的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和交 ...

  7. java算法竞赛:快速读入输出

    我们在使用java写算法题时,常常会因为超时而苦恼,明明是和C++一样的思路,甚至代码实现都极为相似,但是却比它慢上一大截,这时候不妨试试IO流读入输出数据,提升速度. 参考文章 Java写算法题中那 ...

  8. 蓝桥杯算法竞赛系列第0章——蓝桥必考点及标准模板库STL(上)(万字博文,建议抱走)

    欢迎来到:遇见蓝桥遇见你,不负代码不负卿! 目录 ​ 一.蓝桥必考点剖析 二.什么是STL 三.vector的常见用法详解 1.vector的定义 2.vector容器内元素的访问 (1).通过下标访 ...

  9. C++ STL常用标准库容器入门(vector,map,set,string,list...)

    STL常用标准库容器 C++ STL中最基本以及最常用的类或容器无非就是以下几个: 目录 string vector deque list forward_list queue priority_qu ...

最新文章

  1. Linux下mysql ERROR 1045,Mysql无法执行批处理
  2. 关闭rdlc报表打印预览后,关闭客户端,抛出异常“发生了应用程序级的异常 将退出”...
  3. 【MATLAB教程案例2】GPS信号捕获算法的案例分析
  4. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
  5. robocopy帮助
  6. ugui unity 取消选择_UGUI中几种不规则按钮的实现方式
  7. 判断对象属性值是否为空
  8. NBU调用crontab备份
  9. 下面属于javascript内部对象的有_JavaScript从零开始——面向对象编程(2)
  10. Flutter基础—常用控件之容器
  11. matlab虚拟现实之建立simulink虚拟现实工具箱的使用
  12. JAVA编程思想——读书笔记 类再生
  13. javasript深度拷贝
  14. 分表用到的一些函数/php mysql 前面补0
  15. paip.提升安全性--------用户密码控件方案总结
  16. Oracle数据库出现“本地计算机上的OracleOraDB11g_homeTNSListener服务启动后停止.....”问题解决方案...
  17. 开发移动网页应用的一些技术指导
  18. 吉米多维奇数学分析每日一题--习题1382
  19. 华为数通笔记-DHCPv6原理与实验
  20. 9个优秀的标签云免费生成工具

热门文章

  1. [医疗信息化][DICOM教程]HL7 V3 Standard-概述-HL7 V3 Standard - A High Level Overview
  2. 计算机中心英语怎么说,计算机中心,computer center,音标,读音,翻译,英文例句,英语词典...
  3. 客户端性能优化实战经验分享
  4. vue2+element使用插件导出全部表格数据
  5. 从FrameDebugger看Unity渲染
  6. java输出中写html标签,java 输出html标签
  7. Groovy语言 Grails框架入门
  8. android开发中对图片的处理方式汇总
  9. 用html做相册需要什么,如何快速有效的生成HTML相册?
  10. 不要盲目满足用户需求,造成过度设计