AcWing 829. 模拟队列
原题链接
简单
作者:
泠鸢yousa
,
2021-06-03 21:19:11
,
所有人可见
,
阅读 280
数组模拟
1. 普通队列:
tt指针为实点,初始为-1,插入时q[++tt] = x
hh > tt时,队列为空.
队列不空时,一直保证hh <= tt
一旦tt到达n,即使tt - hh + 1 < Size,队列未满,此时队列不可继续插入
使用场景:入队列的元素个数不超过Size,且不会重复入队列
如Dijkstra算法
2. 循环队列,双向循环队列:
tt为虚点,初始为0,插入时q[tt++] = x
hh == tt时,队列为空
hh != tt时,队列不空
(tt + 1) % Size == hh,此时队列已满(采用浪费一个tt空间 mod空间大小 来判断为空为满的情况)
即便tt到达n,只要(tt + 1) % Size != hh,则队列未满,只需要让tt = 0即可实现循环队列
hh到达n,亦是如此
使用场景:入队列的元素个数不超过Size,并且允许重复入队列
如spfa算法
循环队列写法
#include<cstdio>
const int N = 100010;
int n;
int q[N];
int main() {
scanf("%d", &n);
int hh = 0, tt = 0;
char str[10];
int x;
while (n--) {
scanf("%s", str);
if (str[0] == 'p' && str[1] == 'u') {
scanf("%d", &x);
q[tt++] = x;
} else if (str[0] == 'p') {
q[hh++];
} else if (str[0] == 'e') {
if (hh == tt) puts("YES");
else puts("NO");
} else {
printf("%d\n", q[hh]);
}
}
return 0;
}
普通队列写法
#include<cstdio>
const int N = 100010;
int n;
int q[N];
int main() {
scanf("%d", &n);
int hh = 0, tt = -1;
char str[10];
int x;
while (n--) {
scanf("%s", str);
if (str[0] == 'p' && str[1] == 'u') {
scanf("%d", &x);
q[++tt] = x;
} else if (str[0] == 'p') {
q[hh++];
} else if (str[0] == 'e') {
if (hh > tt) puts("YES");
else puts("NO");
} else {
printf("%d\n", q[hh]);
}
}
return 0;
}