学了STL,在此处做一些总结。
常用的STL有如下几个:
- stack
- queue
- priority_queue
- pair
- set
- map
- vector
下面让我们来分别了解一下前两个吧
stack
stack,翻译为栈。
stack <int> s;//定义一个为 int,栈名为 s 的栈
栈是一个先进后出的数组,它支持以下几种操作:
- pop(),用于弹出栈顶。
- top(),同于查询栈顶
- empty(),用于查询栈是否为空,是则返回1
- push(x),用于把 x 存入栈中
例题讲解
题目描述:
假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成, 以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。
输入格式:
输入包括一行数据,即表达式
输出格式:
输出文件包括一行,即“YES” 或“NO”。
样例输入:
2*(x+y)/(1-x)@
样例输出
YES
这道题很简单,我们只需要在输入一个字符的时候就判断,如果为左括号就把他入栈,如果是右括号的话就进行压栈(就是弹出一个值),同时判断栈是否为空,具体实现如下:
#include <cstdio>#include <stack>using namespace std;stack <int> s;int main() {char x;while ((x = getchar()) != \'@\') {if (x == \'(\') s.push(x);else if (x == \')\') {if (s.empty()) {printf(\"NO\");return 0;}else {s.pop();}}}if (s.empty()) {printf(\"YES\");}else printf(\"NO\");return 0;}
queue
queue,翻译为队列
queue <int> q;//定义一个 int 的队列,队列名为 q
队列支持以下几种操作:
- q.front() 用于查询队列头的元素,与栈大同小异
- q.pop() 用于弹出队列尾部的元素
- q.push(x) 与栈一样,同于在栈中插入一个新的元素
- q.empty() 与栈一样
例题讲解
题目描述:
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲只能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一个程序,模拟上述舞伴配对问题。
输入格式:
第 1 行两个正整数,表示男士人数 m 和女士人数 n,1≤m,n≤1000; 第 2 行一个正整数,表示舞曲的数目 k,k≤1000。
输出格式:
共 k 行,每行两个数,之间用一个空格隔开,表示配对舞伴的序号,男士在前,女士在后。
样例输入:
2 46
样例输出
1 12 21 32 41 12 2
这道题我就直接给代码了,注释打在代码上:
#include <cstdio>#include <queue>//头文件using namespace std;queue <int> men, women;//男士,女士int main() {int n, m, k;scanf(\"%d %d %d\", &n, &m, &k);for (int i = 1; i <= n; i++) {men.push(i); //先把男士的编号输进去,以便后续操作}for (int i = 1; i <= m; i++) {women.push(i); //同上}for (int i = 1; i <= k; i++) {printf(\"%d %d\\n\", men.front(), women.front());//依次取出队列的顶端,即匹配男士和女士int x = men.front(), y = women.front();//把两个队列的队尾保存men.pop();women.pop(); //弹出men.push(x);women.push(y); //把他们插入队尾,不懂得可以自行在草稿本上演算}return 0;}```配对舞伴的序号,男士在前,女士在后。
样例输入:
2 46
样例输出
1 12 21 32 41 12 2
就到这里了,其他STL在其他博客里面有详细的解释哦~;
(因为 stack 与 queue 很简单,所以就在这篇博客里面简述,其他几个STL我会非常详细解释的!)
welcome to see you next time!