第二節、算法中的公平——隊列
阿新 • • 發佈:2018-05-24
算法基礎 隊列 結構體 面向對象 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語言的特征了)
有興趣可以自己搜索下哈。
第二節、算法中的公平——隊列