(2)Go實現(xiàn)順序隊列

隊列是一種線性結(jié)構(gòu)
只能從一端(隊尾)添加元素,只能從另一端(隊首)取出元素,屬于先進先出的結(jié)構(gòu)

// 順序隊列的實現(xiàn)

type queue interface{}

type sliceQueue struct {
    queues []queue
}

func NewQueue() *sliceQueue {
    return &sliceQueue{}
}

func (i *sliceQueue) Len() int {
    return len(i.queues)
}

func (i *sliceQueue) Cap() int {
    return cap(i.queues)
}

func (i *sliceQueue) Enqueue(item interface{}) {
    i.queues = append(i.queues, item)
}

func (i *sliceQueue) Dequeue() (queue, error) {
    if i.Len() == 0 {
        return nil, errors.New(
            "failed to dequeue,queue is empty ")
    }

    queue := i.queues[0]
    i.queues = i.queues[1:]
    return queue, nil
}

func (i *sliceQueue) GetFront() (queue, error) {
    if i.Len() == 0 {
        return nil, errors.New(
            "failed to getFront,queue is empty ")
    }
    return i.queues[0], nil
}

func (i *sliceQueue) IsEmpty() bool {
    return i.Len() == 0
}

// 隊列測試
func main() {
    a := queue3.NewQueue()

    for i := 0; i < 5; i++ {
        a.Enqueue(strconv.Itoa(i) + "-hello toilet ")
    }

    fmt.Printf("isEmpty: %v, len=%v, cap=%v, getFront=%v\n",
        a.IsEmpty(), a.Len(), a.Cap(), fmt.Sprintln(a.GetFront()))
    fmt.Printf("isEmpty: %v, len=%v, cap=%v, dequeue=%v\n",
        a.IsEmpty(), a.Len(), a.Cap(), fmt.Sprintln(a.Dequeue()))
    fmt.Printf("isEmpty: %v, len=%v, cap=%v, dequeue=%v\n",
        a.IsEmpty(), a.Len(), a.Cap(), fmt.Sprintln(a.Dequeue()))
    fmt.Printf("isEmpty: %v, len=%v, cap=%v, dequeue=%v\n",
        a.IsEmpty(), a.Len(), a.Cap(), fmt.Sprintln(a.Dequeue()))
    fmt.Printf("isEmpty: %v, len=%v, cap=%v, dequeue=%v\n",
        a.IsEmpty(), a.Len(), a.Cap(), fmt.Sprintln(a.Dequeue()))
    fmt.Printf("isEmpty: %v, len=%v, cap=%v, dequeue=%v\n",
        a.IsEmpty(), a.Len(), a.Cap(), fmt.Sprintln(a.Dequeue()))
    fmt.Printf("isEmpty: %v, len=%v, cap=%v, dequeue=%v\n",
        a.IsEmpty(), a.Len(), a.Cap(), fmt.Sprintln(a.Dequeue()))
    fmt.Printf("isEmpty: %v, len=%v, cap=%v, getFront=%v\n",
        a.IsEmpty(), a.Len(), a.Cap(), fmt.Sprintln(a.GetFront()))
}
// 測試結(jié)果
isEmpty: false, len=5, cap=8, getFront=0-hello toilet  <nil>
isEmpty: false, len=5, cap=8, dequeue=0-hello toilet  <nil>
isEmpty: false, len=4, cap=7, dequeue=1-hello toilet  <nil>
isEmpty: false, len=3, cap=6, dequeue=2-hello toilet  <nil>
isEmpty: false, len=2, cap=5, dequeue=3-hello toilet  <nil>
isEmpty: false, len=1, cap=4, dequeue=4-hello toilet  <nil>
isEmpty: true, len=0, cap=3, dequeue=<nil> failed to dequeue,queue is empty 
isEmpty: true, len=0, cap=3, getFront=<nil> failed to getFront,queue is empty 

順序隊列的缺陷是每次取出元素,都要重新遍歷一次隊列,時間復雜度為O(n),冗余操作太多

下面鏈接有更好的實現(xiàn)方法,循環(huán)隊列
http://www.itdecent.cn/p/8a26bedb48a1

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 今天下午,語文課的時候,老師讓我們寫家庭作業(yè):黃岡小狀元、課堂生字和預習課文。我一聽到趕緊寫課堂生字,過了十...
    俊浩閱讀 184評論 0 3
  • 在網(wǎng)絡上曾經(jīng)看過一個段子:“女人哪有什么性冷淡,只是沒有睡對人罷了。” 性,重要嗎?當然重要! 有西方學者提出了一...
    小白云的兜率菜園閱讀 9,643評論 62 91
  • 業(yè)務需求:一個頁面加載2次請求,保證兩次請求完成后,在頁面加載數(shù)據(jù)。 參考:主要參考方法 注意: 是為了在主線程進...
    maomao_tong閱讀 676評論 2 0
  • 文/亦詩 很多時候我們感覺時間過的好慢??!可是,它卻總在不經(jīng)意間就為我們的青春畫上了句號,來不及說再見,來不及去告...
    亦詩同學閱讀 373評論 1 2

友情鏈接更多精彩內(nèi)容