1、什麼是棧git
這是杭州地鐵1號線線路圖。大衛哥考考你們,地鐵列車如何調頭?github
我也不賣關子了,列車一般是用「人字軌道」來變換車道。數組
列車先從A軌道開進「人字軌道」裏,再從B軌道開出。從A軌道開進去的時候1號車箱是車頭,從B開出來的時候4號車箱就變成車頭了。因此你們看到地鐵先後各一個車頭。「人字軌道」有個特色:先進後出,英文簡寫就是FILO,含義本身體會。計算機專家把「人字軌道」抽象出來,提出了一個叫「棧」的概念。ui
棧和「人字軌道」的特色是同樣的FIFO,只不過把車箱換成了數據。接下來,看大衛哥把棧扒的底褲不剩。spa
2、棧的結構code
大衛哥把棧拆分紅容器和鏈表兩塊,容器用結構體實現,鏈表用單鏈表,固然你們也能夠用其餘鏈表結構,甚至數組來實現。blog
3、接口說明及實現接口
一、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、小結
仔細觀察的同窗能夠發現,大衛哥壓棧和出棧的順序是從單鏈表的表頭開始的。
你們能夠嘗試下從尾巴壓榨和出棧。
還能夠嘗試下用雙向鏈表、循環鏈表甚至數組,總之一句話,只要你開心就好。話太多了,下一節,大衛哥想聊聊隊列,這個結構最近很火,在事件處理,大吞吐量系統裏有卓越的表現。