真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么在golang中實(shí)現(xiàn)一個(gè)環(huán)形隊(duì)列

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)怎么在golang中實(shí)現(xiàn)一個(gè)環(huán)形隊(duì)列,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)從2013年成立,先為天等等服務(wù)建站,天等等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為天等企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

什么是環(huán)形隊(duì)列

在一個(gè)指定大小的數(shù)組里循環(huán)寫入數(shù)據(jù),借用二個(gè)指針分別實(shí)現(xiàn)入隊(duì)標(biāo)記與出隊(duì)標(biāo)記.也體現(xiàn)了指針的大好用處,請(qǐng)深入體會(huì).大有裨益.

如圖所示,一個(gè)環(huán)形隊(duì)列.含有二個(gè)指針: 隊(duì)列頭指針,隊(duì)列尾指針.

怎么在golang中實(shí)現(xiàn)一個(gè)環(huán)形隊(duì)列

實(shí)現(xiàn)環(huán)形隊(duì)列圖示過程

初始化一個(gè)數(shù)組大小為6的環(huán)形隊(duì)列, 頭指針front=0, 尾指針rear=0, 剛好front=rear =0的狀態(tài),表示環(huán)形隊(duì)列為空.

怎么在golang中實(shí)現(xiàn)一個(gè)環(huán)形隊(duì)列

2.向環(huán)形隊(duì)列里插入1個(gè)元素,則rear指針移動(dòng)一格,front=0,rear=1

怎么在golang中實(shí)現(xiàn)一個(gè)環(huán)形隊(duì)列

3.繼續(xù)添加a2,a3,a4,a5元素,rear指針指到末尾處,front=0, reat=5

怎么在golang中實(shí)現(xiàn)一個(gè)環(huán)形隊(duì)列

4.如果再繼續(xù)添加a6元素,則rear=6,大于數(shù)組大小,發(fā)生數(shù)組溢出.

怎么在golang中實(shí)現(xiàn)一個(gè)環(huán)形隊(duì)列

5.如上圖所示添加a6時(shí),rear指針發(fā)生溢出.我們使用一個(gè)小技巧,當(dāng)rear=6時(shí)與數(shù)組大小6進(jìn)行取模, (rear+1) % maxLen,讓rear指針回到開始處rear=0,問題來了,我們無法判斷數(shù)組是否滿?因?yàn)槌跏蓟瘯r(shí)front=rear=0, 現(xiàn)在數(shù)組滿也是front=rear=0

怎么在golang中實(shí)現(xiàn)一個(gè)環(huán)形隊(duì)列

6.解決以上問題有三種辦法,我們采用第3種方法實(shí)現(xiàn).

怎么在golang中實(shí)現(xiàn)一個(gè)環(huán)形隊(duì)列

使用第3種方法: 即當(dāng)(rear+1) % maxLen == front時(shí),判斷環(huán)形數(shù)組滿,則無法添加元素

怎么在golang中實(shí)現(xiàn)一個(gè)環(huán)形隊(duì)列

golang版代碼實(shí)現(xiàn)過程

a. 定義環(huán)形數(shù)據(jù)結(jié)構(gòu)

type CycleQueue struct {
 data []interface{} //存儲(chǔ)空間
 front int      //前指針,前指針負(fù)責(zé)彈出數(shù)據(jù)移動(dòng)
 rear int      //尾指針,后指針負(fù)責(zé)添加數(shù)據(jù)移動(dòng)
 cap  int      //設(shè)置切片最大容量 
}

b.初始化環(huán)形隊(duì)列

func NewCycleQueue(cap int) *CycleQueue {
 return &CycleQueue{
  data: make([]interface{}, cap),
  cap:  cap,
  front: 0,
  rear: 0,
 }
}

c. 入隊(duì)操作

//入隊(duì)操作
//判斷隊(duì)列是否隊(duì)滿,隊(duì)滿則不允許添加數(shù)據(jù)
func (q *CycleQueue) Push(data interface{}) bool {
 //check queue is full
 if (q.rear+1)%q.cap == q.front { //隊(duì)列已滿時(shí),不執(zhí)行入隊(duì)操作
  return false
 }
 q.data[q.rear] = data     //將元素放入隊(duì)列尾部
 q.rear = (q.rear + 1) % q.cap //尾部元素指向下一個(gè)空間位置,取模運(yùn)算保證了索引不越界(余數(shù)一定小于除數(shù))
 return true
}

d.出隊(duì)操作

//出隊(duì)操作
//需要考慮: 隊(duì)隊(duì)為空沒有數(shù)據(jù)返回了
func (q *CycleQueue) Pop() interface{} {
 if q.rear == q.front {
  return nil
 }
 data := q.data[q.front]
 q.data[q.front] = nil
 q.front = (q.front + 1) % q.cap
 return data
}

e:求當(dāng)前的環(huán)形隊(duì)列長度

//因?yàn)槭茄h(huán)隊(duì)列, 后指針減去前指針 加上最大值, 然后與最大值 取余
func (q *CycleQueue) QueueLength() int {
 return (q.rear - q.front + q.cap) % q.cap
}

上述就是小編為大家分享的怎么在golang中實(shí)現(xiàn)一個(gè)環(huán)形隊(duì)列了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)頁題目:怎么在golang中實(shí)現(xiàn)一個(gè)環(huán)形隊(duì)列
網(wǎng)頁鏈接:http://weahome.cn/article/jghges.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部