前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解密QQ——队列

解密QQ——队列

作者头像
Zoctopus
发布2018-06-04 11:19:56
1.2K3
发布2018-06-04 11:19:56
举报
文章被收录于专栏:章鱼的慢慢技术路

一、问题引入

小明和小丽同在一个自习室上自习,小明感觉小丽是一个很不错的女孩,于是他鼓足勇气向小丽要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++。

三、代码实现

代码语言:javascript
复制
    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)原则。

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

代码语言:javascript
复制
struct queue{
    int data[100];  //队列的主体
    int head;  //队首
    int tail;  //队尾 
};

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

代码语言:javascript
复制
#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; 
} 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-04-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、问题引入
  • 二、分析
  • 三、代码实现
  • 四、总结
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档