# Freda的队列

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;
}

在看完代码后,应该有一种感觉,如果我们用数组模拟,可以很好的实现在头部增加元素和删除元素。

猜你喜欢

转载自blog.csdn.net/Fly_the_start/article/details/105199740