No.2.1 解密QQ-队列
一、解密一个队列:“6 3 1 7 5 8 9 2 4”
首先将第1 个数删除,紧接着将第2 个数放到这串数的末尾,再将第3 个数删除并将第4 个数放到这串数的末尾,再将第5 个数删除……直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一起就是结果
注意:
1.这里的删除、从队头移动到队尾,并不是像python里面那样,真的list.pop, list.insert,而是通过指针的移动,假装进行删除、移动,比如:head++表示头位置后移,相当于删除了原来的队头;q[tail] = q[head], tail++, head++ 相当于将队头移动到队尾
2.tail 指向的是队尾(即最后一位元素)的下一个位置,那么队列中只剩下一个元素时,队首和队尾不会重合(相差1);
#include "stdio.h"
int main()
{
int q[102]={0,6,3,1,7,5,8,9,2,4},head,tail;
head = 1;
tail = 10; //队列中已经有9个元素了,tail指向队尾的后一个位置
while (head < tail){
//打印队首并将队首出队
printf("%d ",q[head]);
head++;
//先将新队首的数添加到队尾
q[tail] = q[head];
tail++;
//再将队首出队,但是不打印
head++;
}
return 0;
}
二、队列:只许在队首进行删除(出队),队尾进行插入(入队)操作,FIFO原则
struct queue
{
int data[100]; //队列的主体,用来存储内容
int head; //队首
int tail; //队尾
}; //放在main函数的外面,并且有 “;”
struct queue q; //定义一个变量q,struct queue 要作为一个整体存在;
q.head=1;
q.tail=1;
scanf("%d",&q.data[q.tail]); //队列成员的访问
改写上面的例子:
struct queue {
int data[100];
int head;
int tail;
};
void main(){
struct queue q; //初始化队列
q.head = 1;
q.tail = 1;
int i,n;
scanf("%d", &n); //输入数字
for (i=1;i<=n;i++){ //将输入的数字,写入队尾,并使队列的尾指针自加
scanf("%d",&q.data[q.tail]);
q.tail++;
}
while (q.head < q.tail){ //解密过程,注意q.data的使用
printf("%d ",q.data[q.head]);
q.head++;
q.data[q.tail] = q.data[q.head];
q.tail++;
q.head++;
}
}
浙公网安备 33010602011771号