還是先放這張圖,以便對比和理解:
佇列是限制在兩端進行插入操作和刪除操作的線性表,允許進行存入操作的一端稱為「隊尾」,允許進行刪除操作的一端稱為「隊頭」。當線性表中沒有元素時,稱為「空隊」。特點:先進先出(fifo)。
一、順序佇列
建立順序佇列結構必須為其靜態分配或動態申請一片連續的儲存空間,並設定兩個指標進行管理。乙個是隊頭指標front,它指向隊頭元素;另乙個是隊尾指標rear,它指向下乙個入隊元素的儲存位置,如圖所示
每次在隊尾插入乙個元素是,rear增1;每次哎隊頭刪除乙個元素時,front增1。隨著插入和刪除操作的進行,佇列元素的個數不斷變化,佇列所佔的儲存空間也在為佇列結構所分配的連續空間中移動。當front=rear時,佇列中沒有任何元素,稱為空佇列。當rear增加到指向分配的連續空間之外時,佇列無法再插入新元素,但這時往往還有大量可用空間未被占用,這些空間是已經出隊的佇列元素曾經占用過得儲存單元。
在實際使用佇列時,為了使佇列空間能重複使用,往往對佇列的使用方法稍加改進:無論插入或刪除,一旦rear指標增1或front指標增1 時超出了所分配的佇列空間,就讓它指向這片連續空間的起始位置。自己真從n(maxsize)增1變到0,可用取餘運算rear%n和front%n來實現。這實際上是把佇列空間想象成乙個環形空間,環形空間中的儲存單元迴圈使用,用這種方法管理的佇列也就稱為迴圈佇列。
在迴圈佇列中,當隊列為空時,有front=rear,而當所有佇列空間全佔滿時,也有front=rear。為了區別這兩種情況,規定迴圈佇列最多只能有maxsize-1個佇列元素,當迴圈佇列中只剩下乙個空儲存單元時,佇列就已經滿了。因此,佇列判空的條件時front=rear,而佇列判滿的條件時front=(rear+1)%maxsize。
總結:
1、隊頭指標front,指向隊頭元素的位置的前乙個位置。即指向預留的位置;
2、隊尾指標rear,指向隊尾元素的位置;
3、入隊: rear = (rear + 1) % n (maxsize),然後元素放入隊尾rear所指向的位置;
4、出隊: front = (front + 1) % n,然後取出隊頭指標front所指向的元素;
5、隊空: front == rear;
6、隊滿: (rear + 1) % n == front, n為陣列的元素個數;
7、為了區別空隊和滿隊,滿隊元素個數比陣列元素個數少乙個。
下面是順序佇列的運算:
順序佇列也是順序表的一種,具有順序表同樣的儲存結構,由陣列定義,配合使用陣列下表表示的隊頭指標和隊尾完成各種操作:
#define n 64 //佇列中資料元素的資料型別
typedef int data_t;
typedef struct
sequeue_t;
1、建立空佇列
sequeue_t *createemptysequeue()
2、摧毀乙個佇列
void destroysequeue(sequeue_t *queue)
}
3、判斷乙個佇列是否為空
int emptysequeue(sequeue_t *queue)
4、判斷乙個佇列是否為滿
int fullsequeue(sequeue_t *queue)
5、清空乙個佇列
void clearsequeue(sequeue_t *queue)
6、入隊
int enqueue(sequeue_t *queue, data_t x)
7、出隊
int dequeue(sequeue_t *queue, data_t *x)
return 0;
}
二、鏈式佇列用鍊錶表示的佇列簡稱為鏈佇列,如下圖所示
乙個鏈佇列顯然需要兩個分別指示隊頭和隊尾的指標(分別成為頭指標和尾指標)才能唯一確定。這裡,和線性表的單鏈表一樣,為了操作方便起見,我們也給佇列新增乙個頭結點,並令頭指標指向頭節點。由此,空的鏈佇列的判決條件為頭指標和尾指標均指向頭結點,如下圖所示:
鏈佇列的操作記為單鏈表的插入和刪除操作的特殊情況,插入操作在隊尾進行,刪除操作在隊頭進行,由隊頭指標和隊尾指標控制佇列的操作:
typedef int data_t;
typedef struct node_t
linknode_t,*linklist_t;
typedef struct
linkqueue_t;
1、建立空佇列
linkqueue_t *createemptylinkqueue()
2、摧毀乙個鏈佇列
void destroylinkqueue(linkqueue_t *queue)
}
3、清空乙個鏈佇列
void clearlinkqueue(linkqueue_t *queue)
queue->rear = null;}
4、判斷鏈隊列為空
int emptylinkqueue(linkqueue_t *queue)
5、入隊
int enqueue(linkqueue_t *queue,data_t x)
else
return 0;
}
6、出隊
int dequeue(linkqueue_t *queue,data_t *x)
Linux C 資料結構 佇列
先進先出的線性表。允許在兩端進行插入和刪除的線性表。一端負責插入資料 入隊。使用 rear 隊尾指標 另一端負責刪除資料 出隊。使用 front 隊頭指標 include include define max 6 typedef struct sequeue t sequeue t create e...
Linux C語言 動態資料結構
煉表裡的各個位址不一定是連續的 靜態鍊錶的定義 初始化以及遍歷 include struct weapon int main return0 輸出結果 linux ubuntu workspace2 les4 a.out 100,150200 250 300,350靜態鍊錶的所有節點都是在程式中定義...
資料結構 佇列
一 佇列的迴圈陣列實現。1 初始化 空佇列。令rear front 0。2 入佇列 約定rear指向佇列尾元素的下乙個位置。入佇列時,先判斷佇列是否已滿,而後將array rear x 然後rear 3 出佇列 約定front指向佇列的首元素位置。出佇列時,先判斷佇列是否為空,而後返回隊首元素re ...