新聞中心
本篇文章給大家分享的是有關Golang中怎么實現(xiàn)Queue數(shù)據(jù)結構,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)建站專注于望都網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供望都營銷型網(wǎng)站建設,望都網(wǎng)站制作、望都網(wǎng)頁設計、望都網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務,打造望都網(wǎng)絡公司原創(chuàng)品牌,更為您提供望都網(wǎng)站排名全網(wǎng)營銷落地服務。
需求
隊列的特性較為單一,基本操作即初始化、獲取大小、添加元素、移除元素等。最重要的特性就是滿足先進先出。
實現(xiàn)
接下來還是按照以前的套路,一步一步來分析如何利用Go的語法特性實現(xiàn)Queue這種數(shù)據(jù)結構。
定義
首先定義每個節(jié)點Node結構體,照例Value的值類型可以是任意類型,節(jié)點的前后指針域指針類型為node
type node struct { value interface{} prev *node next *node }
繼續(xù)定義鏈表結構,定義出頭結點和尾節(jié)點的指針,同時定義隊列大小size:
type LinkedQueue struct { head *node tail *node size int }
大小
獲取隊列大小,只需要獲取LinkedQueue中的size大小即可:
func (queue *LinkedQueue) Size() int { return queue.size }
Peek
Peek操作只需要獲取隊列隊頭的元素即可,不用刪除。返回類型是任意類型,用接口實現(xiàn)即可。另外如果head指針域為nil,則需要用panic拋出異常,一切ok的話,返回隊頭節(jié)點的數(shù)值即可:
func (queue *LinkedQueue) Peek() interface{} { if queue.head == nil { panic("Empty queue.") } return queue.head.value }
添加
添加操作在隊列中是比較重要的操作,也要區(qū)分隊尾節(jié)點是否為nil,根據(jù)是否為nil,執(zhí)行不同的連接操作,最后隊列的size要加1,為了不浪費內(nèi)存新增節(jié)點的指針變量要置nil:
func (queue *LinkedQueue) Add(value interface{}) { new_node := &node{value, queue.tail, nil} if queue.tail == nil { queue.head = new_node queue.tail = new_node } else { queue.tail.next = new_node queue.tail = new_node } queue.size++ new_node = nil }
移除
隊列的刪除操作也是很簡單,無非是節(jié)點的斷開操作。在此之前,需要判斷鏈表的狀態(tài)即是否為nil?而后移除的隊列最前端的節(jié)點,先用一個新的變量節(jié)點保存隊列前面的節(jié)點,進行一系列操作之后,至nil,并將長度減少即可。
func (queue *LinkedQueue) Remove() { if queue.head == nil { panic("Empty queue.") } first_node := queue.head queue.head = first_node.next first_node.next = nil first_node.value = nil queue.size-- first_node = nil }
以上就是Golang中怎么實現(xiàn)Queue數(shù)據(jù)結構,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)頁題目:Golang中怎么實現(xiàn)Queue數(shù)據(jù)結構
分享URL:http://www.ef60e0e.cn/article/ihshhp.html