首页 > 编程语言 > 详细

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

时间:2018-05-23 23:29:54      阅读:372      评论:0      收藏:0      [点我收藏+]
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语言的特征了)

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

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

原文:http://blog.51cto.com/10163636/2119652

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!