摘要:
数组模拟队列模板题。
题目
实现一个队列,队列初始为空,支持四种操作:
push x– 向队尾插入一个数 $x$;pop– 从队头弹出一个数;empty– 判断队列是否为空;query– 查询队头元素。
现在要对队列进行 $M$ 个操作,其中的每个操作 $3$ 和操作 $4$ 都要输出相应的结果。
输入格式
第一行包含整数 $M$,表示操作次数。
接下来 $M$ 行,每行包含一个操作命令,操作命令为 push x,pop,empty,query 中的一种。
输出格式
对于每个 empty 和 query 操作都要输出一个查询结果,每个结果占一行。
其中,empty 操作的查询结果为 YES 或 NO,query 操作的查询结果为一个整数,表示队头元素的值。
数据范围
- $ 1≤M≤100000 $,
- $ 1≤x≤109 $,
- 所有操作保证合法。
输入样例:
10
push 6
empty
query
pop
empty
push 3
push 4
pop
query
push 6
输出样例:
NO
6
YES
4
思路
维护一个数组,用于存放队列中的数;维护一个头指针,一个尾指针,分别用于指向队列的头部和尾部。我们在尾部放入元素,在头部取出元素。当头指针位置在尾指针左侧意味着队列非空,可以初始化头指针和尾指针分别为0和-1.
代码
1 |
|
- 初始化头指针和尾指针,值不一定非得是
0,-1。当我们初始化为0,-1时,头指针在尾指针右边,表明当前队列为空。为什么初始化hh要在tt右边呢?一般来说,因为考虑队列仅有一个值的情况,此时必须要让hh和tt指向同一个值(重叠),所以初始化tt要在hh左边偏移一位,这样我在第一次push的时候,tt++,和hh刚好重叠。也正因为如此,可以用hh与tt的相对位置来判空。
原题链接:AcWing 820. 模拟队列