golang環形佇列實現

2021-09-29 10:54:39 字數 2409 閱讀 6013

table of contents

什麼是環形佇列

實現環形佇列圖示過程

golang版**實現過程

參考全部**

在乙個指定大小的陣列裡迴圈寫入資料,借用二個指標分別實現入隊標記與出隊標記.也體現了指標的大好用處,請深入體會.大有裨益.

如圖所示,乙個環形佇列.含有二個指標: 佇列頭指標,佇列尾指標.

初始化乙個陣列大小為6的環形佇列, 頭指標front=0, 尾指標rear=0, 剛好front=rear =0的狀態,表示環形隊列為空.

2.向環形佇列裡插入1個元素,則rear指標移動一格,front=0,rear=1

3.繼續新增a2,a3,a4,a5元素,rear指標指到末尾處,front=0, reat=5

4.如果再繼續新增a6元素,則rear=6,大於陣列大小,發生陣列溢位.

5.如上圖所示新增a6時,rear指標發生溢位.我們使用乙個小技巧,當rear=6時與陣列大小6進行取模, (rear+1) % maxlen,讓rear指標回到開始處rear=0,問題來了,我

們無法判斷陣列是否滿?因為初始化時front=rear=0, 現在陣列滿也是front=rear=0

6.解決以上問題有三種辦法,我們採用第3種方法實現.

使用第3種方法: 即當(rear+1) % maxlen == front時,判斷環形陣列滿,則無法新增元素

a. 定義環形資料結構

type cyclequeue struct  //儲存空間

front int //前指標,前指標負責彈出資料移動

rear int //尾指標,後指標負責新增資料移動

cap int //設定切片最大容量

}

b.初始化環形佇列

func newcyclequeue(cap int) *cyclequeue , cap),

cap: cap,

front: 0,

rear: 0,

}}

c. 入隊操作

//入隊操作

//判斷佇列是否隊滿,隊滿則不允許新增資料

func (q *cyclequeue) push(data inte***ce{}) bool

q.data[q.rear] = data //將元素放入佇列尾部

q.rear = (q.rear + 1) % q.cap //尾部元素指向下乙個空間位置,取模運算保證了索引不越界(餘數一定小於除數)

return true

}

d.出隊操作

//出隊操作

//需要考慮: 隊隊為空沒有資料返回了

func (q *cyclequeue) pop() inte***ce{}

data := q.data[q.front]

q.data[q.front] = nil

q.front = (q.front + 1) % q.cap

return data

}

e:求當前的環形佇列長度

//因為是迴圈佇列, 後指標減去前指標 加上最大值, 然後與最大值 取餘

C 環形佇列實現

總體思想就是不讓rear和front的值超過maxn的大小。於是就在rear和front自增時候模maxn。注意!空隊時rear等於front,滿隊時必須空乙個位置。但是size就是size,說存3個就是存3個 include using namespace std template typenam...

golang使用陣列模擬環形佇列 demo

定義環形佇列結構體 type loopqueue struct 定義環形佇列的新增資料方法 func loop loopqueue add val int loop.rear 如果溢位了則會覆蓋佇列前面先進來的資料 但是這些資料是後面進來的 要遵循 fifo原則,則佇列首部指標往後面移動 if lo...

golang資料結構之環形佇列

目錄結構 circlequeue 環型佇列 type circlequeue struct push 向佇列中新增乙個值 func q circlequeue push val int err error q.array q.rear val 隊尾不包含元素 q.rear q.rear 1 q.ma...