学了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 4
6
样例输出
1 1
2 2
1 3
2 4
1 1
2 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
", men.front(), women.front());//依次取出队列的顶端,即匹配男士和女士
int x = men.front(), y = women.front();//把两个队列的队尾保存
men.pop();
women.pop(); //弹出
men.push(x);
women.push(y); //把他们插入队尾,不懂得可以自行在草稿本上演算
}
return 0;
}
```配对舞伴的序号,男士在前,女士在后。
样例输入:
2 4
6
样例输出
1 1
2 2
1 3
2 4
1 1
2 2
就到这里了,其他STL在其他博客里面有详细的解释哦~;
(因为 stack 与 queue 很简单,所以就在这篇博客里面简述,其他几个STL我会非常详细解释的!)
welcome to see you next time!