資料結構(C語言) 佇列

2021-10-25 13:41:10 字數 4443 閱讀 7942

二、佇列的儲存實現及運算實現

佇列也是一種運算受限的線性表。

(1)佇列的定義

假設有乙個佇列q=(a1…an),佇列中元素按(a1…an)的次序入隊後,入隊的第乙個元素a1為隊頭元素,最後乙個元素an為隊尾元素,佇列的操作是按先進先出的原則進行的,這種先進先出的規則應用在資料結構中稱為佇列,佇列又稱為先進先出的線性表。

(2)佇列的特性

(1)初始化佇列

初始化條件:佇列不存在。

操作結果:構造乙個空佇列

(2)判斷佇列是否為空

初始化條件:佇列存在。

操作結果:隊列為空返回0,不為空返回1。

(3)入隊

初始化條件:佇列存在。

操作結果:將資料元素插入到隊尾

(4)出隊

初始化條件:佇列存在且不為空。

操作結果:將隊頭資料賦值給「x」,然後刪除

(5)取隊頭元素

初始化條件:佇列存在。

操作結果:將隊頭資料賦值給「x」,然後輸出

(6)顯示佇列元素

初始化條件:佇列存在且不為空。

操作結果:將佇列元素按先進先出原則輸出

(1)順序佇列的定義

佇列的順序儲存結構稱為順序佇列。類似於順序表的定義,順序佇列用了乙個一位陣列和兩個分別指向隊頭和隊尾元素的變數。

(2)順序佇列的定義

typedef

int datatype;

typedef

struct circularqueuecircularqueue;

(1)迴圈佇列就是將順序佇列的首尾相連接。形成乙個「環形」,事實上迴圈佇列依然是順序佇列,只是邏輯上不同。迴圈佇列最大空間為100,陣列下標為0~99之間,隊頭與隊尾指標指向同乙個位置為空隊,非空時隊中隊頭指標front指向佇列中隊頭元素的前乙個位置,隊尾rear指向佇列的隊尾元素位置。

假設佇列開闢的陣列單元數為100,它們的陣列下標在0~99之間,若使隊頭或隊尾增加1,可以利用取摸運算及取餘。

入隊時尾指標增加1:

rear=

(rear+1)

%100

;

出隊時隊頭指標加1:

front=

(front+1)

%100

;

-迴圈佇列解決了假溢位的問題,但是有出現了乙個新問題,隊滿不在是rear=100-1而是front==rear和隊空條件相同。解決這一問題有三種解決方案,但是我覺得最方便的還是損失乙個單元不用,當迴圈佇列中元素的個數為100-1時就認為隊滿。及判斷隊滿的條件為:

(rear+1)

%100

==front;

(2)迴圈佇列的基本操作實現

void

initcircularqueue

(circularqueue *queue)

else

}

int

judge

(circularqueue *queue)

else

}

int

theteamisfull

(circularqueue *queue)

else

}

void

displayelements

(circularqueue *queue)

else

}}

void

jointheteam

(circularqueue *queue)

else

printf

("\ninput error, please re-enter:");

memset

(p,0

,sizeof p)

;gets

(p);}if

(strcmp

(p,start)==0

)while

(strcmp

(p,end)!=0

)}if(k+i==i&&i==1)

}else

}

void

getoutoftheteam

(circularqueue *queue)

else

printf

("\ninput error, please re-enter:");

memset

(p,0

,sizeof p)

;gets

(p);}if

(strcmp

(p,start)==0

) l=queue->front;

while

(strcmp

(p,end)!=0

)else

continue;}

}if(k+i==i&&i==0)

else

}

void

lineheadelement

(circularqueue *queue)

else

}

(1)用鏈式儲存結構實現的佇列稱為鏈隊,乙個鏈佇列需要一哥隊頭指標和乙個隊尾指標才能唯一確定,佇列中元素的結構和前面單鏈表的結點的結構一樣。

(2)鏈隊的型別定義

typedef

int data;

typedef

struct chainteamchainteam;

typedef

struct

linkqueue;

(3)鏈隊的基本操作與實現

linkqueue *

initializethechain()

else

return team;

}

int

judgmentchain

(linkqueue *team)

else

}

void

jointhechainteam

(linkqueue *team)

printf

("\ninput error, please enter 「start」to start joining the queue:");

memset

(q,0

,sizeof q)

;gets

(q);}if

(strcmp

(q,start)==0

)while

(strcmp

(q,end)!=0

)if(j!=0)

else

}

void

outofthechainteam

(linkqueue *team)

printf

("input error, enter 「start」to start queuing:");

memset

(q,0

,sizeof q)

;gets

(q);}if

(strcmp

(q,start)==0

)while

(strcmp

(q,end)!=0

)free

(p);

printf

("open input and outbound elements:");

memset

(q,0

,sizeof q)

;gets

(q);

j++;continue;}

printf

("do not meet the queuing rules, please re-enter:");

memset

(q,0

,sizeof q)

;gets

(q);}if

(j!=0)

else

}

void

output

(linkqueue *team)

else

}}

void

teamleader

(linkqueue *team)

else

}

void

destruction

(linkqueue *team)

if(team->front==

null

)else

}

C語言 資料結構 佇列

1 佇列簡介 佇列是一種特殊的線性表,它只允許在表的前端進行刪除操作,而在表的後端進行插入操作,進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇列。2 佇列的聲名 和棧不同,我將鍊錶中的每個元素新增上頭指標與尾指標 還有乙個計數器,判空時可以直接拿來用 將其變成乙個佇列...

C語言 資料結構 佇列

佇列也是一組元素的集合,也提供兩種基本操作 enqueue 入隊 將元素新增到隊尾,dequeue 出隊 從隊頭取出元素並返回。就像排隊買票一樣,先來先服務,先入隊的人也是先出隊的,這種方式稱為fifo first in first out,先進先出 有時候佇列本身也被稱為fifo。棧操作的top指...

C語言資料結構 鏈佇列

鏈佇列與鍊錶相似,不同的是它具有對列的運算方法,儲存結構和鍊錶相同,下面是其結構示意圖 這裡的 q類似於鍊錶的頭節點 head 它包含兩個指向佇列節點的指標front和rear 當front和rear都為 時隊列為空 front指向佇列第乙個節點,rear指向最後乙個節點,當兩者指向同乙個節點說明佇...