新聞中心
在Go語(yǔ)言中,棧是一種非常重要的數(shù)據(jù)結(jié)構(gòu),它遵循LIFO(后進(jìn)先出)原則,即最后進(jìn)入的元素會(huì)首先被彈出,Go語(yǔ)言的棧主要有兩種實(shí)現(xiàn)方式:一種是使用內(nèi)置的make函數(shù)創(chuàng)建切片(slice),另一種是使用Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的container/list包,下面將詳細(xì)介紹這兩種實(shí)現(xiàn)方式。

創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的黃岡網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
1. 使用切片作為棧
在Go語(yǔ)言中,可以使用切片(slice)作為棧實(shí)現(xiàn),切片是一個(gè)動(dòng)態(tài)數(shù)組,可以根據(jù)需要自動(dòng)調(diào)整大小,以下是使用切片實(shí)現(xiàn)棧的一個(gè)示例:
package main
import "fmt"
type Stack struct {
data []int
}
func (s *Stack) Push(value int) {
s.data = append(s.data, value)
}
func (s *Stack) Pop() (int, error) {
if len(s.data) == 0 {
return 0, fmt.Errorf("stack is empty")
}
lastValue := s.data[len(s.data)-1]
s.data = s.data[:len(s.data)-1]
return lastValue, nil
}
func (s *Stack) Peek() (int, error) {
if len(s.data) == 0 {
return 0, fmt.Errorf("stack is empty")
}
return s.data[len(s.data)-1], nil
}
func (s *Stack) IsEmpty() bool {
return len(s.data) == 0
}
func main() {
stack := &Stack{}
stack.Push(1)
stack.Push(2)
stack.Push(3)
fmt.Println(stack.Pop()) // 輸出:3
fmt.Println(stack.Peek()) // 輸出:2
fmt.Println(stack.IsEmpty()) // 輸出:false
}
在上面的示例中,我們定義了一個(gè)名為Stack的結(jié)構(gòu)體,它包含一個(gè)data字段,用于存儲(chǔ)棧中的元素,我們還定義了四個(gè)方法:Push用于向棧中添加元素,Pop用于從棧中彈出元素,Peek用于查看棧頂元素,IsEmpty用于檢查棧是否為空。
2. 使用container/list作為棧
除了使用切片,還可以使用Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的container/list包實(shí)現(xiàn)棧。container/list包提供了一個(gè)雙向鏈表,可以方便地實(shí)現(xiàn)棧的功能,以下是使用container/list實(shí)現(xiàn)棧的一個(gè)示例:
package main
import (
"container/list"
"fmt"
)
type Stack struct {
l *list.List
}
func NewStack() *Stack {
return &Stack{l: list.New()}
}
func (s *Stack) Push(value interface{}) {
s.l.PushBack(value)
}
func (s *Stack) Pop() (interface{}, error) {
if s.l.Len() == 0 {
return nil, fmt.Errorf("stack is empty")
}
return s.l.Remove(s.l.Back()), nil
}
func (s *Stack) Peek() (interface{}, error) {
if s.l.Len() == 0 {
return nil, fmt.Errorf("stack is empty")
}
return s.l.Back(), nil
}
func (s *Stack) IsEmpty() bool {
return s.l.Len() == 0
}
func main() {
stack := NewStack()
stack.Push(1)
stack.Push(2)
stack.Push(3)
fmt.Println(stack.Pop()) // 輸出:3
fmt.Println(stack.Peek()) // 輸出:2
fmt.Println(stack.IsEmpty()) // 輸出:false
}
在上面的示例中,我們定義了一個(gè)名為Stack的結(jié)構(gòu)體,它包含一個(gè)l字段,用于存儲(chǔ)雙向鏈表,我們還定義了四個(gè)方法:Push用于向棧中添加元素,Pop用于從棧中彈出元素,Peek用于查看棧頂元素,IsEmpty用于檢查棧是否為空,與使用切片實(shí)現(xiàn)的棧相比,使用container/list實(shí)現(xiàn)的棧具有更高的性能和更低的內(nèi)存開(kāi)銷(xiāo)。
當(dāng)前文章:golang的棧在哪里
當(dāng)前路徑:http://www.5511xx.com/article/cddioog.html


咨詢(xún)
建站咨詢(xún)
