【模板】队列
题目链接
题目描述
请你实现一个队列(queue),支持如下操作:
push(x)
:向队列中加入一个数 x x x。pop()
:将队首弹出。如果此时队列为空,则不进行弹出操作,并输出ERR_CANNOT_POP
。query()
:输出队首元素。如果此时队首为空,则输出ERR_CANNOT_QUERY
。size()
:输出此时队列内元素个数。
输入格式
第一行,一个整数 n n n,表示操作的次数。
接下来 n n n 行,每行表示一个操作。格式如下:
1 x
,表示将元素x
加入队列。2
,表示将队首弹出队列。3
,表示查询队首。4
,表示查询队列内元素个数。
输出格式
输出若干行,对于每个操作,按「题目描述」输出结果。
每条输出之间应当用空行隔开。
样例 #1
样例输入 #1
13
1 2
3
4
1 233
3
2
3
2
4
3
2
1 144
3
样例输出 #1
2
1
2
233
0
ERR_CANNOT_QUERY
ERR_CANNOT_POP
144
提示
样例解释
首先插入 2
,队首为 2
、队列内元素个数为 1
。
插入 233
,此时队首为 2
。
弹出队首,此时队首为 233
。
弹出队首,此时队首为空。
再次尝试弹出队首,由于队列已经为空,此时无法弹出。
插入 144
,此时队首为 144
。
数据规模与约定
对于 100 % 100\% 100% 的测试数据,满足 n ≤ 10000 n\leq 10000 n≤10000,且被插入队列的所有元素值是 [ 1 , 1000000 ] [1, 1000000] [1,1000000] 以内的正整数。
题解思路
队列与栈不同之处在于,先进队列的先出队列,就像排队一样,先排队的人可以先获得资格。那么,就需要有一个索引(指针)——front
记住排在队伍最前面的元素位置,同时有一个索引(指针)——succ
记住排在最后面的元素位置。
当有元素入栈时,succ
索引向后移动。当有元素出队时,front
向后移动。当两个指针在同一位置时,说明栈内为空,不能执行出队操作,栈的大小为0。
题解代码
#include <bits/stdc++.h>
using namespace std;
const int N = 10001;
class MyQueue
{
private:
int front = 0, succ = 0;
int nums[N];
public:
void push(int x)
{
nums[succ] = x;
succ = (succ + 1) % N;
}
void pop()
{
if (front != succ)
{
front = (front + 1) % N;
}
else
{
printf("ERR_CANNOT_POP\n");
}
}
void query()
{
if (succ > front)
{
printf("%d\n", nums[front]);
}
else
{
printf("ERR_CANNOT_QUERY\n");
}
}
void size()
{
printf("%d\n", succ - front);
}
};
int main()
{
MyQueue queue;
int n;
scanf("%d", &n);
while (n--)
{
int op;
scanf("%d", &op);
if (op == 1)
{
int x;
scanf("%d", &x);
queue.push(x);
}
if (op == 2)
{
queue.pop();
}
if (op == 3)
{
queue.query();
}
if (op == 4)
{
queue.size();
}
}
return 0;
}