二、佇列的儲存實現及運算實現
佇列也是一種運算受限的線性表。
(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指向最後乙個節點,當兩者指向同乙個節點說明佇...