数据结构之队列(案例版)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_19642249/article/details/53946393

队列是一种特殊性的线性结构,它只允许在队列的首部(head)进行删除操作,这个称作”出队”,而在队列的尾部(tail)进行插入工作,叫做”入队”。这就是我们常说的”先进先出“原则。生活中有很多的这样的案例,例如我们排队买火车票,每个排队买票的窗口就是一个队列,人越靠前就越早买到火车票,越早买完就越早从队列出来,后来的在队尾进入。

为了让大家更好的理解队列,在这里简单的介绍一个案例(这个案例来自《啊哈!算法》,写的非常通俗易懂,推荐初学者可以看看)。

假如:你遇见你喜欢的女神,想问她要QQ号,但是女神不想直接给你,对QQ号进行了相应的加密,同时也把加密的规则告诉你了。规则是这样的:首先将第1个数删除,紧接着将第2个数放到这串数的最后一个数,在将第3个数删除并将第4个数放到队尾,—–直到剩下最后一个数麻将最后一个数删除。按照刚才删除的顺序,把这些删除的数连接在一起就是女神的QQ。是不是追女神特别不容易!加密后的数是”7,3,3,8,5,7,8,4,8”.

好啦,现在该你了,怎样才能破解女神的QQ号呢,如果没有理解错解密规则的话女神的QQ号”735888473”。

其实解密的过程就像”排队”。从前面拿两个,第一个扔掉,第二个放到尾部。具体的过程是这样的:”7 3 3 8 5 7 8 4 8”,首先删除7并将3放到最后,这串数变成”3 8 5 7 8 4 8 3”,一次往下类推就能能得到女神的QQ号”735888473”.(其实这是我的QQ号,如果愿意技术交流的话欢迎添加)

下面用C简单的实现了解密 的效果:

#include <stdio.h>
int main()
{
    int q[100] = {0,7,3,3,8,5,7,8,4,8};
    //初始化队列
    int head = 1,tail = 10;   //队列中有9个元素,tail值得是队尾的后一个位置

    //当队列不为空的时候执行循环
    while(head < tail)  
    {
        //打印队首并将队首出队
        printf("%d",q[head]);
        head++;

        //将新队首的数添加到队尾
        q[tail] = q[head];
        tail++;
        //再将队首出队
        head++;
    }
    getchar();getchar();
    return 0;
}

在这里我们引入了两个变量head和tail,head代表队列的队首,tail代表队尾的下一个位置。那为什么tail不直接记录队尾呢?这是因为当队列只剩一个元素时队首和队尾重合会带来一些麻烦。我们这里规定队首和队列重合时,队列为空,然后跳出循环。

队列是广度优先搜索以及队列优先的Bellman-Ford最短路算法的核心数据结构。为了更好的理解,现在将队列的三个基本要素(一个数组,两个变量)封装为一个结构体。

#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++;

    }
    getchar();getchar();
    return 0;
}

上面的这种写法虽然有点冗余,但可以加强对队列的认识。本篇文章只是举例简单的介绍了队列,如果想更多的了解一下队列的知识,请查看其他的文档,后续博主也会单独写一篇更加详细的文档。

猜你喜欢

转载自blog.csdn.net/qq_19642249/article/details/53946393