队列是一种特殊的线性结构。引入两个整型变量head和tail,head用来记录队列的队首(即第一位),tail用来记录队列的队尾(即最后一位)的下一个位置。(原因:队列只剩一个元素时,队首和队尾重合会带来一些麻烦)我们规定队首和队尾重合时,队列为空。
它只允许在队列的首部(head)进行删除操作,这称为“出队”,而在队列的尾部tail进行插入操作,这称为“入队”。当队列没有元素时(即head==tail),称为空队列。我们也称为“先进先出”(First In First Out,FIFO)原则。
在队首删除一个数的操作是head++;
在队尾增加一个数(x)的操作是q[tail]=x; tail++;
废话不多说,我们来看一道例题,具体学习一下队列的应用。
例题:
解密QQ号。规则是这样的:首先将第1个数删除,紧接着将第2个数放到这串数的末尾,再将第3个数删除并将第4个数再放到这串数的末尾,再将第5个数删除……直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一起就是真实的QQ啦。加密过的一串数是“6 3 1 7 5 8 9 2 4”。解密后的QQ号应该是“6 1 5 9 4 7 2 8 3”。
#include <stdio.h>
struct queue{
int data[100000];
int head; //队首
int tail; //队尾
};
int main(){
struct queue q;
int n,i;
//初始化队列
q.head=0;
q.tail=0;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&q.data[q.tail]);
q.tail++;
}
while(q.head<q.tail){
//打印队首,并将队首出队
printf("%d ",q.data[q.head]);
q.head++;
//先将新队首的数添加到队尾
q.data[q.tail] = q.data[q.head];
q.tail++;
//再将队首出队
q.head++;
}
return 0;
}
输入样例:
9
6 3 1 7 5 8 9 2 4
输出样例:
6 1 5 9 4 7 2 8 3