Freda的队列
这个题目一眼看,数据范围就很大,如果直接用队列,大于0的元素要放在开头,还要复制操作,于是就想,可不可以用数组进行模拟呢?可以的,但是发现,数组每次下标增加,新的元素都是放在之前元素的后面,好像不符合题目放在队头的描述,但是如果我们把下标前进当成head,数组下标0的位置当成末尾,就可以了。abcabc的复制和cbacba没有本质上的区别只有相反一下而已,abcabc放入新的d也是dabcdabc和cbacbad没有什么差别,于是就借助这点,完成了基本操作。但是复制操作可能会使得数组越界,根据题目的描述,我们发现每次只取出一个数,也就是说,数组再长我们也是取出不完的,所以,限定复制长度再10^6为止,我们就实现了数组的优化和时间的优化和空间的优化。
下面就是我实现的代码
#include <iostream>
#include <stdio.h>
using namespace std;
const int MAX = (1e6 + 10) * 2;
int a[MAX];
int main(){
int n;
scanf("%d", &n);
int x;
int head = 0, tail = 0;
for(int i = 0; i < n; i++){
scanf("%d", &x);
if(x > 0){
a[head++] = x;
} else if(x == 0){
if(head>1e6) continue;
int count = head;
for(int i = tail; i < head; i++){
a[count++] = a[i];
}
head = count;
}else {
if(head == tail)continue;
printf("%d\n", a[--head]);
}
}
return 0;
}
在看完代码后,应该有一种感觉,如果我们用数组模拟,可以很好的实现在头部增加元素和删除元素。