Go數據結構之棧

1、什麼是棧git

%E5%9C%B0%E9%93%81.png

這是杭州地鐵1號線線路圖。大衛哥考考你們,地鐵列車如何調頭?github

我也不賣關子了,列車一般是用「人字軌道」來變換車道。數組

%E4%BA%BA%E5%AD%97%E8%BD%A8%E9%81%93.png

列車先從A軌道開進「人字軌道」裏,再從B軌道開出。從A軌道開進去的時候1號車箱是車頭,從B開出來的時候4號車箱就變成車頭了。因此你們看到地鐵先後各一個車頭。「人字軌道」有個特色:先進後出,英文簡寫就是FILO,含義本身體會。計算機專家把「人字軌道」抽象出來,提出了一個叫「棧」的概念。ui

%E6%A0%88.png

棧和「人字軌道」的特色是同樣的FIFO,只不過把車箱換成了數據。接下來,看大衛哥把棧扒的底褲不剩。spa

2、棧的結構code

%E6%A0%88%E6%8B%86%E5%88%86.png

大衛哥把棧拆分紅容器和鏈表兩塊,容器用結構體實現,鏈表用單鏈表,固然你們也能夠用其餘鏈表結構,甚至數組來實現。blog

3、接口說明及實現接口

%E6%A0%88%E6%8E%A5%E5%8F%A3.png

一、Init隊列

初始化棧,其實就是初始化裏面的鏈表。事件

func (stack *Stack) Init() {
    lst := new(List)
    (*stack).list = lst
    lst.Init()
}

二、Push

數據入棧,也叫壓棧,就是把車子開進去。大衛哥把新的車箱都放在了鏈表頭,你也能夠放車尾,只要你開心就好。

func (stack *Stack) Push(data Object) bool {
    lst := (*stack).list

    return lst.InsertAtHead(data) // 車子開進去
}

三、Pop

數據出棧,就是把車子開出來,固然是從鏈表頭開出來了。

func (stack *Stack) Pop() Object {
    lst := (*stack).list

    return lst.RemoveAt(0) // 從鏈表頭把車子開出來
}

四、Peek

時不時的偷看下,當前棧裏的最近的車箱,我可沒有偷窺癖,只看不動手。

func (stack *Stack) Peek() Object {
    lst := (*stack).list

    return lst.First()
}

五、GetSize

哎,畢竟如今地皮最貴了,因此不能無止境的放車箱進去,要實時掌握棧裏車箱數量,一旦太多,就要控制下。

func (stack *Stack) GetSize() uint64 {
    lst := (*stack).list

    return lst.GetSize()
}

4、小結
仔細觀察的同窗能夠發現,大衛哥壓棧和出棧的順序是從單鏈表的表頭開始的。
圖片描述

你們能夠嘗試下從尾巴壓榨和出棧。

%E8%A1%A8%E5%B0%BE%E5%85%A5%E6%A0%88.png

還能夠嘗試下用雙向鏈表、循環鏈表甚至數組,總之一句話,只要你開心就好。話太多了,下一節,大衛哥想聊聊隊列,這個結構最近很火,在事件處理,大吞吐量系統裏有卓越的表現。

代碼下載

相關文章
相關標籤/搜索