模拟队列
- 1.题目
- 2.基本思想
- 3.代码实现
1.题目
实现一个队列,队列初始为空,支持四种操作:
push x
– 向队尾插入一个数 x;pop
– 从队头弹出一个数;empty
– 判断队列是否为空;query
– 查询队头元素。
现在要对队列进行 M M M 个操作,其中的每个操作 3 3 3 和操作 4 4 4 都要输出相应的结果。
输入格式
第一行包含整数
M
M
M,表示操作次数。
接下来
M
M
M 行,每行包含一个操作命令,操作命令为 push x
,pop
,empty
,query
中的一种。
输出格式
对于每个 empty
和 query
操作都要输出一个查询结果,每个结果占一行。
其中,empty
操作的查询结果为 YES
或 NO
,query
操作的查询结果为一个整数,表示队头元素的值。
数据范围
1
≤
M
≤
100000
,
1≤M≤100000,
1≤M≤100000,
1 ≤ x ≤ 109 , 1≤x≤109, 1≤x≤109,
所有操作保证合法。 所有操作保证合法。 所有操作保证合法。
输入样例:
10
push 6
empty
query
pop
empty
push 3
push 4
pop
query
push 6
输出样例:
NO
6
YES
4
2.基本思想
用一个数组 q
保存数据。
用 hh
代表队头,q[hh]
就是队头元素, q[hh + 1]
就是第二个元素。
用tt
代表队尾, q[tt]
就是队尾元素, q[tt + 1]
就是下一次入队,元素应该放的位置。
[hh, tt]
左闭右闭,代表队列中元素所在的区间。
出队pop
:因为 hh
代表队头,[hh, tt]
代表元素所在区间。所以出队可以用 hh++
实现,hh++
后,区间变为[hh + 1, tt]
。
入队push
:因为 tt
代表队尾,[hh, tt]
代表元素所在区间。所以入出队可以用 tt++
实现,tt++
后,区间变为[hh, tt + 1]
, 然后在q[tt+1]
位置放入入队元素。
是否为空empty:[hh, tt]
代表元素所在区间,当区间非空的时候,对列非空。也就是tt >= hh
的时候,对列非空。
询问队头query:用 hh
代表队头,q[hh]
就是队头元素,返回 q[hh]
即可。
3.代码实现
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int N = 100010;
static int[] q = new int[N];
static int hh, tt = -1;//分别表示 对头0 队尾-1
public static void main(String[] args) throws IOException {
int m = Integer.parseInt(br.readLine());
while (m-- > 0) {
String[] s = br.readLine().split(" ");
String opt = s[0];
if (opt.equals("push")) {
int x = Integer.parseInt(s[1]);
q[++tt] = x;
} else if (opt.equals("pop")) {
hh++;
} else if (opt.equals("empty")) {
System.out.println(tt >= hh ? "NO" : "YES");
} else if (opt.equals("query")) {
System.out.println(q[hh]);
}
}
}
}