Echo_sun

导航

算法初步——队列

  新学期开始了,小孙是小单的新同桌(小单是个小美女哦),小孙向小单同学询问QQ号(邪魅一笑),小单怎么能这么容易将QQ号告诉小孙呢。所以小单给了小孙一串加密过后的数字并告诉小孙解密规则。规则如下:首先将第一个数删除,再将第二个数放在这串数字的末尾,将第三个数字删除,将第四个数字放在这串数字的末尾……以此类推,直至删除最后一个数字。接下来我们按照数字被删除的顺序将这些数字连在一起,就得到了小单的QQ。小单给小孙的加密数字串为“1 8 4 7 4 7 3 9 2 9”。

  下面我们讲解解密过程:首先我们将队首的1删除并将第二个数字8放在队尾,此时我们的数字串可以更新为“4 7 4 7 3 9 2 9 8”;接下来我们将现在作为队首的4删除并将7放在数字串的末尾,该数串可更新为“4 7 3 9 2 9 8 7”;下面我们将此时的队首4删除并将7放在队尾,数字串更新为“3 9 2 9 8 7 7”;接着我们将3删除并将9放在数串末尾,数串更新为“2 9 8 7 7 9”;下面我们将2删除并将9放置在数串的末尾,将8删除将7放在数串末尾,将7删除并将9放在末尾,删除9并将7放在末尾,删除9,此时队列中只剩下一个数字7,将其删除。此时我们回头看看,我们依次删除了“1 4 4 3 2 8 7 9 9 7”,你们不妨加她试试看(^_^)。

  讲到这里我相信大家已经可以完成编程过程了,好了我们下课。

  虚晃一枪,我们继续。

#include<iostream>
using namespace std;

int main()
{
    int q[102] = { 1,8,4,7,4,7,3,9,2,9 }, head, tail;
    //初始化队列
    head = 0;
    tail = 10;//队列中已经有了10个数字,tail指向队尾的下一个位置
    while (head < tail)//当队列不为空时执行循环
    {
        //输出队首并将队首出队
        cout << q[head] << " ";
        head++;

        //将新队首的数放到队尾
        q[tail] = q[head];
        tail++;
        //将新队首出队
        head++;
    }
    cout << endl;
    return 0;
}

  怎么样,上面的代码有没有运行成功?现在我们来总结一下队列的概念。队列是一种特殊的线性结构,他只允许在队列的首部(head)进行删除操作,称为“出队”;在队列的尾部进行插入操作,称为“出队”。当队列中没有元素时(即head==tail),称为“空队列”。队列是一个非常有原则的人:它只允许“先进先出”,就像我们生活中的排队一样,谁先来排队谁就先走。

  队列是我们以后将会学习的广度优先搜索以及队列优化的 Bellman-Ford最短路算法的核心数据结构。所以我们可以将队列的三个基本元素封装为一个结构体类型。

typedef struct queue
{
    int data[101];//队列的主体,用来储存数据
    int head;//队列的头
    int tail;//队列的尾
};

  下面我们就可以用结构体来实现队列操作了:

#include<iostream>
using namespace std;

typedef struct queue
{
    int data[101];//队列的主体,用来储存数据
    int head;//队列的头
    int tail;//队列的尾
};

int main()
{
    queue q;
    //初始化队列
    q.head = 0;
    q.tail = 0;
    for (int i = 0; i < 10; i++)
    {
        //依次向队列插入10个数
        cin >> q.data[q.tail];
        q.tail++;
    }

    while (q.head < q.tail)
    {
        //输出队首并将队首出队
        cout << q.data[q.head] << " ";
        q.head++;

        //将新队首的数放到队尾
        q.data[q.tail] = q.data[q.head];
        q.tail++;

        //再将队首出队
        q.head++;
    }
    cout << endl;
    return 0;
}

  这样我们就完成了一个完整的队列操作,并获取了一位美女的QQ号。

posted on 2022-04-16 22:36  Echo_sun  阅读(51)  评论(0编辑  收藏  举报