zl程序教程

您现在的位置是:首页 >  其他

当前栏目

算法:队列之解密QQ号案例的算法

2023-09-27 14:22:46 时间

今天跟大家聊一聊关于数据结构中队列的一个有意思的案例,解密QQ号,想必大家都有过向别人要过QQ号吧,在这里,浅浅问一句,你是直接把自己的QQ号告诉他吗?今天教你一招,告诉他一串关于你的QQ号的数字密码让他自己去解密。

============================
解密规则
一般QQ号都是10位吧,所以你的数字密码同样也是10位,就是他对你的数字密码进行一下操作:首先将第1个数字删除掉,再将第2个数字移动到这组数字的末尾,将第3个数字删除掉,将第4个数字继续移动到这组数字的末尾,依次循环进行上述操作,直到删除所有的数字密码位置,然后按照刚才删除数字的顺序进行依次排序即可得到你的QQ号码喽!在这里偷偷告诉一下我自己的数字密码:1490793738,你也可以去试试自己的数字密码是多少哦~~

============================

下面就是你去找10张卡片进行上面的步骤进行模拟一下解密过程了,如果你的解密过程没有错误,解密后我的QQ号就应该是“1973349870”,如果解密出来不是这个,可能你还没有完全理解加密过程或者在解密的过程出了问题了,可以重新试一下哦~~

如果你的解密规则和解密过程完全没有问题,那么可以使用试下编写程序来实现该功能,我相信你一定可以实现出来的~

============================
下面给你提供一个简单的实现思路方法

#include <stdio.h>
int main()
{
	int q[102] = {1,4,9,0,7,9,3,7,3,8},head,tail;
	//初始化队列
	head = 0;
	tail = 10;
	while(head<tail){
		//输出队首元素并将队首元素出队
		printf("%d",q[head]);
		head++;
		//先将新队首元素添加到队尾去
		q[tail] = q[head];
		tail++;
		//再将队首元素出队
		head++;
	}
	getchar();
	getchar();
	return 0;
} 

最后输出的就是1973349870,没有实现的可以试试上述的代码哦~

如果你没有学习过数据结构也没关系,上面的代码就是用了一下简单的队列结构的思想,下面给你简单阐述一下队列的基本概念,队列是一种特殊的线性数据结构,它只允许在队首(head)进行删除操作,这就是所谓的“出队”操作,同样的道理在队尾(tail)进行元素的插入操作,这便是所谓的“入队”操作,当且仅当队列中没有元素的时候(即head = tail),此时的队列称为“空队列”

在我们的日常生活中有很多跟队列有关的实例,比如我们在食堂打饭,在银行取钱,在车站买票排队的时候,每一个窗口都是一个队列,在这个队列中新来的人都会自动排到队伍的末尾去,最先取得是最先买到票的,最先离开队列的那个人。这个就跟先来先服务的算法差不多,我们称为“先进先出(First In First Out,FIFO原则)”

============================
队列将是我们今后学习广度优先搜索以及队列优化的Bellman-Ford最短路算法的核心数据结构,所以我们也可以将队列的三个基本元素(一个数组,两个变量)封装为一个结构体类型,如下代码:

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

下面我们定义一个结构体变量Q

struct queue q;

下面我们进行结构体内部元素的访问遍历

q.head = 0;
q.tail = 0;
scanf("%d",&q.data[q.tail]);

下面就是用完整代码队列操作实现解密QQ

#include <stdio.h>
struct queue
{
	//队列的主体,用来存储内容 
	int data[100];
	//队首 
	int head;
	//队尾 
	int tail;
};
int main()
{
	struct queue q;
	q.head = 0;
	q.tail = 0;
	for(int i = 0 ; i < 10 ; 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++;
	}
	getchar();
	getchar(); 
	return 0;
} 

该代码的这种写法看起来虽然有一些冗余了一些,但是可以加强大家对队列这个算法的基本理解。C++的STL库已经有队列的实现方法,如果有兴趣的同学可以参看一些相关材料。