AcWing 829. 模拟队列
. 模拟队列
一、题目描述
实现一个队列,队列初始为空,支持四种操作:
push x
– 向队尾插入一个数 x
;
pop
– 从队头弹出一个数;
empty
– 判断队列是否为空;
query
– 查询队头元素。
现在要对队列进行 个操作,其中的每个操作 和操作 都要输出相应的结果。
输入格式
第一行包含整数 ,表示操作次数。
接下来 行,每行包含一个操作命令,操作命令为 push x
,pop
,empty
,query
中的一种。
输出格式
对于每个 empty
和 query
操作都要输出一个查询结果,每个结果占一行。
其中,empty
操作的查询结果为 YES
或 NO
,query
操作的查询结果为一个整数,表示队头元素的值。
数据范围
,所有操作保证合法。
输入样例:
10
push 6
empty
query
pop
empty
push 3
push 4
pop
query
push 6
输出样例:
NO
6
YES
4
二、理解和感悟
用数组模拟队列,比用数组模拟栈要麻烦一点,因为栈是同一边进同一边出,而队列是尾巴进,脑袋出。
举个栗子
1、先加入一个元素a
,那么需要++tt
,就是tt==0
,然后要求a
出队,就是hh++
,这时,hh=1
,现在队列为空,hh>tt
。
2、因为数组的特点,在数组后面增加元素很方便,在头部增加元素很麻烦,所以设计了hh
在左,tt
在右的策略,出队hh++
,入队++tt
3、使用数组模拟队列的另一个好处,就是可以遍历队列中的每一个数字,这和用数组模拟栈是一样的,这也是比不了的。
三、普通队列解法
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int q[N], hh, tt = -1;
int main() {
int n;
cin >> n;
while (n--) {
string op;
cin >> op;
if (op == "push") cin >> q[++tt];
else if (op == "empty")
hh > tt ? cout << "YES" << endl : cout << "NO" << endl;
else if (op == "query")
cout << q[hh] << endl;
else hh++;
}
return 0;
}
四、循环队列解法
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int q[N], hh, tt;
int main() {
int n;
cin >> n;
while (n--) {
string op;
cin >> op;
if (op == "push") {
cin >> q[tt++];
if (tt == N) tt = 0; // 加冒了,就回到0
} else if (op == "empty")
hh == tt ? cout << "YES" << endl : cout << "NO" << endl;
else if (op == "query")
printf("%d\n", q[hh]);
else {
hh++;
if (hh == N) hh = 0; // 加冒了,就回到0
}
}
return 0;
}
五、总结
- 普通队列的时候,插入时是
q[++tt]
- 循环队列的时候,插入时是
q[tt++]
个人理解:如果真的队列的数量不够,需要重复利用的话,那么进去队列的次数可不小。本来我们用数组模拟队列,一就是因为速度快,二就是因为可以利用数组找出入队列的顺序,也就是 拓扑序,要是真用了循环队列的话,那么被覆盖掉时,拓扑序也就没有机会再找出来了,还不如直接用的,一家之言,待后续的经验验证。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2019-09-09 2018年蓝桥杯比赛试题
2019-09-09 redis启动异常处理一例
2016-09-09 C#实现对指定文件夹中文件按修改时间排序