解密QQ——队列

问题引入

小明和小丽同在一个自习室上自习,小明感觉小丽是一个很不错的女孩,于是他鼓足勇气向小丽要QQ号,然而小丽也是个矜持的女孩,当然不会直接告诉他,所以小丽给了小明一串加密过的数字,同时她也告诉小明解密规则:首先将第一个数删除,紧接着将第2个数放到这串数的末尾,再将第3个数删除并将第4个数放到这串数的末尾,以此类推...直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一起就是小丽的QQ号了。加密过的一串数字为“6 3 1 7 5 8 9 2 4”.

注:如果用9张小纸片,将9个数字分别写在9张纸片上,模拟一下解密过程,正确的结果应该是“6 1 5 9 4 7 2 8 3”。

当然了,如果这么快就结束了这个问题,那还写这个有什么意思呢,下面我们用代码来实现它。

分析:

  1. 首先需要一个数组来存储这一串数即 int q[101],并初始化这个数组即 int q[101]={0,6,3,1,7,5,8,9,2,4} (此处初始化多写一个0是用来填充q[0])。
  2. 解密的第一步是将第一个数删除,删除一个数最简单的方法是将所有后面的数都往前面挪动一位,将前面的数覆盖。就像我们在食堂排队打饭,最前面打饭的人打好后离开了,后面所有的人就需要全部向前面走一步,补上之前的空位,但这样做的缺点是浪费时间。
  3. 在这里,我将引入两个整型变量head和tail。head用来记录队列的队首(第一位),tail用来记录队列的队尾(最后一位)的下一个位置(当队列中只剩下一个元素时,队首和队列重合会带来一些麻烦。我们这里规定队首和队尾重合时,队列为空)。
  4. 所以在队首删除一个数的操作是head++;在队尾增加一个数(假设这个数是x)的操作是q[tail]=x;tail++。
    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;

总结:

  1. 队列是一种特殊的线性结构,它只允许在队列的首部(head)进行删除操作,这称为“出队”,而在队列的尾部(tail)进行插入操作,这称为“入队”。
  2. 当队列中没有元素时(head==tail),称为空队列。
  3. 新来的人总是站在队列的最后面,来得越早的人越靠前,先来的人先服务,我们称为“先进先出”(First In First Out,FIFO)原则。

现在我们将队列的三个基本元素(一个数组,两个变量)封装为一个结构体类型,如下:

struct queue{
    int data[100];  //队列的主体
    int head;  //队首
    int tail;  //队尾
};

下面我们就使用结构体来实现队列的操作:

#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++)
    {
        scanf("%d ",&q.data[q.tail]);  //依次向队列插入9个数
        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;
} 

感受:

生活中处处都有队列的例子,透过现象看本质,往往还会有意外的收获。而且学好队列,还有助于把妹子,向美好的幸福生活前进一步。嗯,说了这么多,我也该好好学习下队列了,以防哪天向妹子要QQ或手机号时也会遇到这样的问题...

希望问题设计中的小明已经成功解密了小丽的QQ号,然后幸福的在一起了~~~

时间: 2024-10-13 23:42:07

解密QQ——队列的相关文章

加解密QQ旋风和迅雷链接地址

/** * 加解密QQ旋风和迅雷链接地址 * ---------------------------------------------------------------------------------------------------------------- * 不止QQ旋风和迅雷,包括网际快车(用的人可能不多)地址的加解密方式都很简单,都是Base64,只不过各自有些小改动罢了 * 先说QQ旋风:它只是本本分分的将原下载地址直接Base64后,再在前面加上QQ旋风的专链标识:qqd

队列——解密QQ号

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

队列浅析[解密QQ号]

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

解密QQ 号——队列

一.问题描述 有一种对一列数字的加密方式,解密规则如下:首先将加密后数字中的第1个数删除,紧接着将第2个数放到这串数的末尾,再将第3个数删除并将第4个数放到这串数的末尾,再将第5个数删除……直到剩下最后一个数,将最后一个数也删除.按照刚才删除的顺序,把这些删除的数连在一起就是原本的数字排列. 例如加密过的一串数是“6 3 1 7 5 8 9 2 4”.解密的过程就像是将这些数“排队”.每次从最前面拿两个,第1个扔掉,第2个放到尾部.具体过程是这样的:刚开始这串数是“6 3 1 7 5 8 9 2

【学习记录】YSM解密QQ号

试题描述: YSM 在年级里人缘特别好,大家都找他要 QQ 号,数学特别好的它有时也小卖弄一下,他把 QQ 号加密后告诉同学们,所以同学们要得到他的 QQ 号还得先解密.解密规则是这样的:首先将第一个数字删除,再讲第二个数字放到这串数的末尾,再将第 3 个数删除并将第 4 个数放到这串数的末尾,再将第5个数删除,........,以此类推,将最后一个数字也删除.按照刚才删除的顺序,把这些删除的数字连在一起,最后的 7 位就是 YSM 的 QQ 号.当然解密后的数字串肯定不止 7 位,不到 100

啊哈!算法:解密QQ号

书中给出的算法有点浪费空间,可以使用循环队列进行改进,这样就不需要使用额外的空间,在原数组的基础上就可以完成解密,代码如下: 1 #include <stdio.h> 2 3 void decode(int a[], int size) 4 { 5 int head = 0, tail = size;//tail point to next position to be written 6 7 while (head != tail){ 8 //删除队首元素 9 printf("%2

队列实现qq解密

规则是这样的:首先将第 1个数删除,紧接着将第 2 个数放到这串数的末尾,再将第 3 个数删除并将第 4 个数放到这串数的末尾,再将第 5 个数删除--.直到剩下最后一个数,将最后一个数也删除.按照刚才删除的顺序,把这些删除的数连在一起就是QQ. 假设是9位的qq. 解决思路:用队列的head指向给出乱序qq的第一个元素,让tail指向qq的末尾的下一个(这样做的目的是为了当head=tail,队列为空).当删除时,只要head++,放到末尾时,将tail++就OK. 队列:队列是一种特殊的线性

《啊哈算法》——栈、队列、链表

通过题目我们可以看出这篇文章将介绍什么,栈.队列.链表本质上是数据结构中的东西,通过这章的学习能够给今后数据结构的学习打下一点基础. 队列: 我们通过一个简单的谜题来引入队列的概念,给出一串9位的加密QQ号,对于这串数字,删除第一位数字,然后将第二位数字放到这串数字的最后.反复操作,直到这一串数字的所有数字都被删除.在这个过程中,按照数字删除先后顺序排列的9位数字的便是解密后的QQ号,请问解密后的QQ号是多少? 其实从数学原理的角度,这个问题并没有什么难度,非常好理解,但关键在于,如何通过程序来

第二章、栈、队列、链表

第一节.解密QQ号——队列p29 解密QQ号——队列 #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])