【题目来源】
https://www.lanqiao.cn/problems/3745/learning/
【题目描述】
在蓝桥学院的新餐厅,学生们在取餐窗囗形成了一条长队。小蓝,餐厅的经理,希望能够实时了解队伍最前面和最后面的学生编号。你需要执行以下三种操作:
1.学生进入队列:编号为x的学生排到队伍的末尾。
2.学生离开队列:最前面的学生拿到餐后离开队伍。
3.查询队列状态:输出当前队伍最前面和最后面的学生编号。
请注意,学生们可能会在吃完饭后再次排队。
【输入格式】
首先,你会看到一个整数q,表示你需要执行的操作次数。
接下来的q行,每行将包含一个或两个整数,代表一次操作:
1. 1 x:编号为x的学生加入队伍。
2. 2:最前面的学生拿到餐并离开队伍。
3. 3:输出当前队伍最前面和最后面的学生编号(两个编号之间用一个空格隔开)。
数据范围保证:1<x, q<10^5。进行操作2和3时,队伍一定非空。每个学生的编号都是唯一的。
【输出格式】
对于每一次的3操作,输出一行包含两个整数,即当前队伍最前面和最后面的学生编号。
【输入样例】
5
1 1
1 3
3
2
3
【输出样例】
1 3
3 3
【说明】
对于给出的样例,队伍的变化过程如下:
1.编号为1的学生加入队伍,队列变为q=[1]。
2.编号为3的学生加入队伍,队列变为q=[1,3]。
3.输出队伍最前面和最后面的学生编号,分别为1和3。
4.最前面的学生拿到餐并离开队伍,队列变为q=[3]。
5.输出队伍最前面和最后面的学生编号,分别为3和3。
【算法分析】
利用数组模拟队列的实现,常有 head=0、tail=0 及 head=0、tail=-1 两种不同的情况。
参见:https://blog.csdn.net/hnjzsyjyj/article/details/133636109
【算法代码】
#include <bits/stdc++.h>
using namespace std;const int maxn=1e5+5;
int q[maxn];
int head=0,tail=-1;int main() {int n,op;cin>>n;while(n--) {cin>>op;if(op==1) {int x;cin>>x;q[++tail]=x;} else if(op==2) {head++;} else if(op==3) {cout<<q[head]<<" "<<q[tail]<<endl;}}return 0;
}/*
in:
5
1 1
1 3
3
2
3out:
1 3
3 3
*/
【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/133636109