在蓝桥学院的新餐厅,学生们在取餐窗口形成了一条长队。小蓝,餐厅的经理,希望能够实时了解队伍最前面和最后面的学生编号。
你需要执行以下三种操作:
- 学生进入队列:编号为 xx 的学生排到队伍的末尾。
- 学生离开队列:最前面的学生拿到餐后离开队伍。
- 查询队列状态:输出当前队伍最前面和最后面的学生编号。
请注意,学生们可能会在吃完饭后再次排队。
输入格式
首先,你会看到一个整数 qq,表示你需要执行的操作次数。
接下来的 qq 行,每行将包含一个或两个整数,代表一次操作:
1 x
:编号为 xx 的学生加入队伍。2
:最前面的学生拿到餐并离开队伍。3
:输出当前队伍最前面和最后面的学生编号(两个编号之间用一个空格隔开)。
数据范围保证:1≤x,q≤1051≤x,q≤105。进行操作 2
和 3
时,队伍一定非空。每个学生的编号都是唯一的。
输出格式
对于每一次的 3
操作,输出一行包含两个整数,即当前队伍最前面和最后面的学生编号。
样例输入
5
1 1
1 3
3
2
3
样例输出
1 3
3 3
说明
对于给出的样例,队伍的变化过程如下:
- 编号为 11 的学生加入队伍,队列变为 q=[1]q=[1]。
- 编号为 33 的学生加入队伍,队列变为 q=[1,3]q=[1,3]。
- 输出队伍最前面和最后面的学生编号,分别为 11 和 33。
- 最前面的学生拿到餐并离开队伍,队列变为 q=[3]q=[3]。
- 输出队伍最前面和最后面的学生编号,分别为 33 和 33。
代码演示:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int x;
int arr[100]={0};
int num;//操作次数
scanf("%d",&num);
int front=0;
int rear=-1;
for(int i=0;i<num;i++)
{
int a;
scanf("%d",&a);
switch(a)
{
case 1:
{
scanf("%d",&x);
arr[++rear]=x;
break;
}
case 2:
{
front++;
break;
}
case 3:
{
printf("%d\t",arr[front]);
printf("%d\n",arr[rear]);
break;
}
default:
break;
}
}
return 0;
}
经验总结:
***printf("%d\t",arr[front]);与printf("%d\t",&arr[front]);的区别
如果表达式的结果为“假”,assert() 会打印出断言失败的信息,并调用 abort() 函数终止程序的执行;如果表达式的结果为“真”,assert() 就什么也不做,程序继续往后执行。
assert()函数还需引用#include <assert.h>
strcpy(arr1,arr2)把arr2复制到arr1中
strcat(arr1,arr2)把arr2追加到arr1后面,但必须保证arr1能够放得下arr2。其中arr2会把\0传过去