隊列(queue)
-
基本介紹
隊列是有序列表,可用數組、鏈錶實現,先入先出(FIFO)的原則。隊列只允許在表的前端(front)進行刪除操作,在表的後端(rear)進行插入操作。
-
順序隊列
使用兩個指針管理順序數組,隊頭指針(front)指向隊頭元素;隊尾指針(rear)指向下一個入隊元素的儲存位置。隊尾插入一個元素時,rear增1;隊頭刪除一個元素時,front增1。
當front=rear時,隊列中沒有任何元素,稱為空隊列。當rear增加到指向分配的連續空間之外時,隊列無法再插入新元素,且無法利用已經出隊的隊列元素曾經佔用過的儲存單元。
溢出:
- 下溢:隊列為空時,做出隊運算。常用作程序控制轉移的條件。
- 真上溢:隊列滿,做入隊運算。應設法避免。
- 假上溢:出隊元素佔用的空間無法利用,但尾指針超越上界無法入隊(不是真正的滿溢)。
-
循環隊列
在實際使用隊列時,為了使隊列空間能重複使用,一旦指針增1時超出了所分配的隊列空間,就讓它指向這片連續空間的起始位置構成一個循環。指針位置從从Max Size-1增1變到0,可用取餘運算來實現。
當隊列為空時,有front=rear,當隊列滿時,也有front=rear。為了區別這兩種情況,規定循環隊列最多只能有Max Size-1個隊列元素,當循環隊列中只剩下一個空儲存單元時,隊列就已經滿了。因此,隊列為空條件是front=rear,隊列為滿條件是front=(rear+1)%Max Size。(因為添加一個數到隊列中後指針向後移動一位,當指針移動到最後一個空間時,隊列滿判斷邏輯將指針位置再次移動,以至於等於了front的位置。)
-
數組實現
順序隊列:
//結構體實現順序隊列 type Queue struct { maxSize int array [5]int front int rear int } //實現隊列的入隊 func (this *Queue)InQueue(val int)(err error) { //判斷隊列是否滿 if this.rear == this.maxSize { //下標從0開始 return errors.New("queue full") } this.array[this.rear] = val this.rear++ return } //實現隊列的出隊 func (this *Queue)OutQueue()(val int