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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二节算法中的公平——队列相关的知识,希望对你有一定的参考价值。

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语言的特征了)

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

以上是关于第二节算法中的公平——队列的主要内容,如果未能解决你的问题,请参考以下文章

第二节 算法

AQS源码剖析第二篇--公平与非公平,条件队列和线程中断

第二节1:OPTICS算法思想和算法流程

(王道408考研数据结构)第三章栈和队列-第二节:队列基本概念顺序栈和链栈基本操作

Clickhouse系列-第二节-基本原理

(王道408考研操作系统)第三章内存管理-第二节2:页面置换算法1