美文网首页人人都懂的算法算法程序员
第二节、算法中的公平——队列

第二节、算法中的公平——队列

作者: linghugoogle | 来源:发表于2018-05-23 22:54 被阅读37次

    1、栗子

    学校食堂打饭、火车站买火车票、公交站等车,都要排队,先来的先上车,车满了,其余只能等下一班了。

    这对大多数人而言,都是相对公平的方式。

    先到先得

    在算法中,也有类似的公平——队列(queue)。

    队列遵循先进先出(First In First Out,简写FIFO)的规则,同栈的实现一样,队列的实现也有数组实现和链表实现两种方式。

    数组实现和链表实现没有绝对的优劣,平时接触数据比较多,所有首选数组实现啦。

    2、准备工作

    队列主要在结构上包括了指向队首和队尾的两个指针,存储数据的线性表。

    操作上,主要包括入队(Enqueue)、出队(Dequeue)。

    队列

    我们可以使用数组维护队列。

    /*
    输出:1 2 3 4 5
    */
    
    #include <stdio.h>
    #include <string.h>
    int main()
    {
        int a[5];
        int head = 0, tail = 0;
    
        int i = 1;
    
        //入队
        while (i <= 5) {
            a[tail++] = i;
            i++;
        }
    
        //出队,当head==tail时,说明队列为空
        while (head < tail)
            printf("%d ", a[head++]);
    
        getchar();getchar();
        return 0;
    }
    

    3、结构体

    int、char等属于基本的数据类型,是构成C语言(或者语言的基础),但在表示复杂的数据类型的时候,基本语言就不够用了。

    比如表示一个同学的姓名、性别、学号、成绩,如果使用基本数据类型,就显得臃肿,而且缺少相互之间的关联。

    char name[100][10];
    char sex[100];
    int number[100];
    int grade[100];
    

    结构体可以解决数据冗余的问题,结构体基于基本的数据类型。

    使用下列结构

    struct name{
    };
    

    例如上述的学生可以表示为:

    struct student {
        char name[10];
        char sex;
        int number;
        int grade;
    };
    struct student stu[100];
    

    直接对stu[100]进行操作就可以了。

    4、使用结构体

    建立下述结构体表示队列。

    struct queue{
        int a[5];
        int head, tail;
    };
    

    对上述同样的代码使用结构体重新表示。

    /*
    输出:1 2 3 4 5
    */
    
    #include <stdio.h>
    #include <string.h>
    struct queue{
        int a[5];
        int head, tail;
    };
    int main()
    {
        //队列初始化
        struct queue q;
        q.head = 0;q.tail = 0;
    
        int i = 1;
    
        //入队
        while (i <= 5) {
            q.a[q.tail++] = i;
            i++;
        }
    
        //出队,当head==tail时,说明队列为空
        while (q.head < q.tail)
            printf("%d ", q.a[q.head++]);
    
        getchar();getchar();
        return 0;
    }
    

    乍一看,使用结构体不仅没有减小工作量,反而增加了!

    这不是错觉,但如果增加题目复杂度,不断的有出队和入队操作呢?要不断的对head和tail进行操作,非常麻烦。

    如果将queue队列单独表示,并对出队和入队操作进行封装,可以极大减小写代码的行数。(这种操作其实就是面向对象了,属于C++和JAVA语言的特征了)

    有兴趣可以自己搜索下哈。

    相关文章

      网友评论

        本文标题:第二节、算法中的公平——队列

        本文链接:https://www.haomeiwen.com/subject/ufmkjftx.html