首页 > 代码库 > 队列浅析[解密QQ号]

队列浅析[解密QQ号]

题目:

新学期开始了,小哈是小哼的新同桌(小哈是个小美女哦~),小哼向小哈询问QQ号,小哈当然不会直接告诉小哼啦,原因嘛你懂的。所以小哈给了小哼一串加密过的数字,同时小哈也告诉了小哼解密规则。规则是这样的:首先将第1个数删除,紧接着将第2个数放到这串数的末尾,再将第3个数删除并将第4个数放到这串数的末尾,再将第5个数删除……直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一起就是小哈的QQ啦。现在你来帮帮小哼吧。小哈给小哼加密过的一串数是“6 3 1 7 5 8 9 2 4”。


数组解析的缺点:

解密的第一步是将第一个数删除,你可以想一下如何在数组中删除一个数呢。最简单的方法是将所有后面的数都往前面挪动一位,将前面的数覆盖。就好比我们在排队买票,最前面的人买好离开了,后面所有的人就需要全部向前面走一步,补上之前的空位,但是这样的做法很耗费时间。


队列解析:

在这里,我将引入两个整型变量head和tail。head用来记录队列的队首(即第一位),tail 用来记录队列的队尾(即最后一位)的下一个位置。你可能会问:为什么tail 不直接记录队尾,却要记录队尾的下一个位置呢?这是因为当队列中只剩下一个元素时,队首和队尾
啊哈!算法重合会带来一些麻烦。我们这里规定队首和队尾重合时,队列为空


技术分享


#include <stdio.h> 
int main() 
{ 
    int q[102]={0,6,3,1,7,5,8,9,2,4},head,tail; 
    int i; 
    //初始化队列
    head=1; 
    tail=10; //队列中已经有9个元素了,tail指向队尾的后一个位置
    while(head<tail) //当队列不为空的时候执行循环
    { 
       //打印队首并将队首出队
       printf("%d ",q[head]); 
       head++; 
       //先将新队首的数添加到队尾
       q[tail]=q[head]; 
       tail++; 
       //再将队首出队
       head++; 
    } 
    return 0; 
} 

队列是一种特殊的线性结构,它只允许在队列的首部(head)进行删除操作,这称为“出队”,而在队列的尾部(tail)进行插入操作,这称为“入队”。当队列中没有元素时(即head==tail),称为空队列。

“先进先出”(First In First Out,FIFO)原则。


下面用队列结合结构体解决:

#include <stdio.h> 

struct queue 
{ 
	int data[100];//队列的主体,用来存储内容
	int head;//队首 
	int tail;//队尾
}; 

int main() 
{ 
	struct queue q; 
	int i; 
	//初始化队列
	q.head=1; 
	q.tail=1; 

	for(i=1;i<=9;i++) 
	{ 
		//依次向队列插入9个数
		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; 
} 

技术分享


C++的STL库已经有队列的实现了。



队列浅析[解密QQ号]