新聞中心
go語言循環(huán)隊(duì)列的實(shí)現(xiàn)
隊(duì)列的概念在 順序隊(duì)列 中,而使用循環(huán)隊(duì)列的目的主要是規(guī)避假溢出造成的空間浪費(fèi),在使用循環(huán)隊(duì)列處理假溢出時(shí),主要有三種解決方案
創(chuàng)新互聯(lián)專注于青陽網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供青陽營(yíng)銷型網(wǎng)站建設(shè),青陽網(wǎng)站制作、青陽網(wǎng)頁設(shè)計(jì)、青陽網(wǎng)站官網(wǎng)定制、微信小程序定制開發(fā)服務(wù),打造青陽網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供青陽網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
本文提供后兩種解決方案。
順序隊(duì)和循環(huán)隊(duì)列是一種特殊的線性表,與順序棧類似,都是使用一組地址連續(xù)的存儲(chǔ)單元依次存放自隊(duì)頭到隊(duì)尾的數(shù)據(jù)元素,同時(shí)附設(shè)隊(duì)頭(front)和隊(duì)尾(rear)兩個(gè)指針,但我們要明白一點(diǎn),這個(gè)指針并不是指針變量,而是用來表示數(shù)組當(dāng)中元素下標(biāo)的位置。
本文使用切片來完成的循環(huán)隊(duì)列,由于一開始使用三個(gè)參數(shù)的make關(guān)鍵字創(chuàng)建切片,在輸出的結(jié)果中不包含nil值(看起來很舒服),而且在驗(yàn)證的過程中發(fā)現(xiàn)使用append()函數(shù)時(shí)切片內(nèi)置的cap會(huì)發(fā)生變化,在消除了種種障礙后得到了一個(gè)四不像的循環(huán)隊(duì)列,即設(shè)置的指針是順序隊(duì)列的指針,但實(shí)際上進(jìn)行的操作是順序隊(duì)列的操作。最后是對(duì)make()函數(shù)和append()函數(shù)的一些使用體驗(yàn)和小結(jié),隊(duì)列的應(yīng)用放在鏈隊(duì)好了。
官方描述(片段)
即切片是一個(gè)抽象層,底層是對(duì)數(shù)組的引用。
當(dāng)我們使用
構(gòu)建出來的切片的每個(gè)位置的值都被賦為interface類型的初始值nil,但是nil值也是有大小的。
而使用
來進(jìn)行初始化時(shí),雖然生成的切片中不包含nil值,但是無法通過設(shè)置的指針變量來完成入隊(duì)和出隊(duì)的操作,只能使用append()函數(shù)來進(jìn)行操作
在go語言中,切片是一片連續(xù)的內(nèi)存空間加上長(zhǎng)度與容量的標(biāo)識(shí),比數(shù)組更為常用。使用 append 關(guān)鍵字向切片中追加元素也是常見的切片操作
正是基于此,在使用go語言完成循環(huán)隊(duì)列時(shí),首先想到的就是使用make(type, len, cap)關(guān)鍵字方式完成切片初始化,然后使用append()函數(shù)來操作該切片,但這一方式出現(xiàn)了很多問題。在使用append()函數(shù)時(shí),切片的cap可能會(huì)發(fā)生變化,用不好就會(huì)發(fā)生擴(kuò)容或收縮。最終造成的結(jié)果是一個(gè)四不像的結(jié)果,入隊(duì)和出隊(duì)操作變得與指針變量無關(guān),失去了作為循環(huán)隊(duì)列的意義,用在順序隊(duì)列還算合適。
參考博客:
Go語言中的Nil
Golang之nil
Go 語言設(shè)計(jì)與實(shí)現(xiàn)
Go語言list(列表)
2021-11-10
列表是一種非連續(xù)的存儲(chǔ)容器,有多個(gè)節(jié)點(diǎn)組成,節(jié)點(diǎn)通過一些變量記錄彼此之間的關(guān)系
單鏈表和雙鏈表就是列表的兩種方法。
原理:A、B、C三個(gè)人,B懂A的電話,C懂B的電話只是單方知道號(hào)碼,這樣就形成了一個(gè)單鏈表結(jié)構(gòu)。
如果C把自己的號(hào)碼給B,B把自己的號(hào)碼給A,因?yàn)槭请p方都知道對(duì)方的號(hào)碼,這樣就形成了一個(gè)雙鏈表結(jié)構(gòu)
如果B換號(hào)碼了,他需要通知AC,把自己的號(hào)碼刪了,這個(gè)過程就是列表的刪除操作。
在Go語言中,列表使用 container/list 包來實(shí)現(xiàn),內(nèi)部的實(shí)現(xiàn)原理是雙鏈表,列表能夠高效地進(jìn)行任意位置的元素插入和刪除操作。
列表初始化的兩種辦法
列表沒有給出具體的元素類型的限制,所以列表的元素可以是任意類型的,
例如給列表中放入了一個(gè) interface{} 類型的值,取出值后,如果要將 interface{} 轉(zhuǎn)換為其他類型將會(huì)發(fā)生宕機(jī)。
雙鏈表支持從隊(duì)列前方或后方插入元素,分別對(duì)應(yīng)的方法是 PushFront 和 PushBack。
列表插入函數(shù)的返回值會(huì)提供一個(gè) *list.Element 結(jié)構(gòu),這個(gè)結(jié)構(gòu)記錄著列表元素的值以及與其他節(jié)點(diǎn)之間的關(guān)系等信息,從列表中刪除元素時(shí),需要用到這個(gè)結(jié)構(gòu)進(jìn)行快速刪除。
遍歷完也能看到最后的結(jié)果
學(xué)習(xí)地址:
如何用go語言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)中的隊(duì)列數(shù)據(jù)類型
你的代碼是想把front到rear的值全部輸出
但是你下面的操作自己檢查一下沒有改變front的值,也沒有改變r(jià)ear的值,所以front!=rear是死循環(huán)
如果好一點(diǎn)的話
void printQueue(LinkQueue *Q)/*依次輸出隊(duì)列*/
{
if(Q-front==Q-rear)
{
printf("隊(duì)列為空");
exit(1);
}
while(Q-front!=Q-rear)/*老師告訴我說是這里的while是死循環(huán),為什么是死循環(huán)呢,不是很懂,請(qǐng)細(xì)說。請(qǐng)幫我改為正確的代碼,謝謝。*/
{
printf("%d, ", Q-front-data);
Q-front=Q-front-next;
}
//exit(0);
}試試可不可以,不行再追問
Go語言使用NSQ消息隊(duì)列
重點(diǎn)提示:
這樣我們就啟動(dòng)了一個(gè) nsqd 的實(shí)例
編寫一個(gè)消息生產(chǎn)者
nsq_single_product.go
編寫一個(gè)消息消費(fèi)者
nsq_single_consumer.go
添加第一個(gè)實(shí)例
添加第二個(gè)實(shí)例
消息生產(chǎn)者
nsq_cluster_product.go
消息消費(fèi)者
nsq_cluster_consumer.go
當(dāng)前標(biāo)題:go語言隊(duì)列 go語言列表
文章地址:http://ef60e0e.cn/article/doeiesh.html