1. 程式人生 > >第二節、算法中的公平——隊列

第二節、算法中的公平——隊列

算法基礎 隊列 結構體 面向對象

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

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

第二節、算法中的公平——隊列