# Stack 栈数据结构,包括ArrayStack(数组栈)和LinkedStack(链表栈)。
## 源码 - [https://github.com/duke-git/lancet/blob/main/datastructure/stack/arraystack.go](https://github.com/duke-git/lancet/blob/main/datastructure/stack/arraystack.go) - [https://github.com/duke-git/lancet/blob/main/datastructure/stack/linkedstack.go](https://github.com/duke-git/lancet/blob/main/datastructure/stack/linkedstack.go) ## 用法 ```go import ( stack "github.com/duke-git/lancet/v2/datastructure/stack" ) ``` ## 目录 ### 1. ArrayStack(数组栈) - [NewArrayStack](#NewArrayStack) - [Push](#ArrayStack_Push) - [Pop](#ArrayStack_Pop) - [Peak](#ArrayStack_Peak) - [Data](#ArrayStack_Data) - [Size](#ArrayStack_Size) - [IsEmpty](#ArrayStack_IsEmpty) - [Clear](#ArrayStack_Clear) ### 2. LinkedStack(链表栈) - [NewLinkedStack](#NewLinkedStack) - [Push](#LinkedStack_Push) - [Pop](#LinkedStack_Pop) - [Peak](#LinkedStack_Peak) - [Data](#LinkedStack_Data) - [Size](#LinkedStack_Size) - [IsEmpty](#LinkedStack_IsEmpty) - [Clear](#LinkedStack_Clear) - [Print](#LinkedStack_Print) ## 文档 ### 1. ArrayStack 用切片实现栈结构 ### NewArrayStack返回ArrayStack指针实例
函数签名: ```go type ArrayStack[T any] struct { data []T length int } func NewArrayStack[T any]() *ArrayStack[T] ``` 示例: ```go package main import ( "fmt" stack "github.com/duke-git/lancet/v2/datastructure/stack" ) func main() { sk := stack.NewArrayStack[int]() fmt.Println(sk) } ``` ### Push将元素加入数组栈
函数签名: ```go func (s *ArrayStack[T]) Push(value T) ``` 示例: ```go package main import ( "fmt" stack "github.com/duke-git/lancet/v2/datastructure/stack" ) func main() { sk := stack.NewArrayStack[int]() sk.Push(1) sk.Push(2) sk.Push(3) fmt.Println(sk.Data()) //[]int{3, 2, 1} } ``` ### Pop删除栈顶元素并返回该元素指针
函数签名: ```go func (s *ArrayStack[T]) Pop() (*T, error) ``` 示例: ```go package main import ( "fmt" stack "github.com/duke-git/lancet/v2/datastructure/stack" ) func main() { sk := stack.NewArrayStack[int]() sk.Push(1) sk.Push(2) sk.Push(3) val, err := sk.Pop() fmt.Println(err) //nil fmt.Println(*val) //3 fmt.Println(sk.Data()) //[]int{2, 1} } ``` ### Peak返回栈顶元素指针
函数签名: ```go func (s *ArrayStack[T]) Peak() (*T, error) ``` 示例: ```go package main import ( "fmt" stack "github.com/duke-git/lancet/v2/datastructure/stack" ) func main() { sk := stack.NewArrayStack[int]() sk.Push(1) sk.Push(2) sk.Push(3) val, err := sk.Peak() fmt.Println(err) //nil fmt.Println(*val) //3 fmt.Println(sk.Data()) //[]int{3, 2, 1} } ``` ### Data返回栈中所有元素组成的切片
函数签名: ```go func (s *ArrayStack[T]) Data() []T ``` 示例: ```go package main import ( "fmt" stack "github.com/duke-git/lancet/v2/datastructure/stack" ) func main() { sk := stack.NewArrayStack[int]() sk.Push(1) sk.Push(2) sk.Push(3) fmt.Println(sk.Data()) //[]int{3, 2, 1} } ``` ### Size返回栈中元素的数量
函数签名: ```go func (s *ArrayStack[T]) Size() int ``` 示例: ```go package main import ( "fmt" stack "github.com/duke-git/lancet/v2/datastructure/stack" ) func main() { sk := stack.NewArrayStack[int]() sk.Push(1) sk.Push(2) sk.Push(3) fmt.Println(sk.Size()) //3 } ``` ### IsEmpty判断栈是否为空
函数签名: ```go func (s *ArrayStack[T]) IsEmpty() bool ``` 示例: ```go package main import ( "fmt" stack "github.com/duke-git/lancet/v2/datastructure/stack" ) func main() { sk := stack.NewArrayStack[int]() fmt.Println(sk.IsEmpty()) //true sk.Push(1) sk.Push(2) sk.Push(3) fmt.Println(sk.IsEmpty()) //false } ``` ### Clear清空栈元素,使栈为空
函数签名: ```go func (s *ArrayStack[T]) Clear() ``` 示例: ```go package main import ( "fmt" stack "github.com/duke-git/lancet/v2/datastructure/stack" ) func main() { sk := stack.NewArrayStack[int]() sk.Push(1) sk.Push(2) sk.Push(3) sk.Clear() fmt.Println(sk.Data()) //[]int{} } ``` ### 2. LinkedStack 链表实现的栈结构。 ### NewLinkedStack返回LinkedStack指针实例
函数签名: ```go type StackNode[T any] struct { Value T Next *StackNode[T] } type LinkedStack[T any] struct { top *datastructure.StackNode[T] length int } func NewLinkedStack[T any]() *LinkedStack[T] ``` 示例: ```go package main import ( "fmt" stack "github.com/duke-git/lancet/v2/datastructure/stack" ) func main() { sk := stack.NewLinkedStack[int]() fmt.Println(sk) } ``` ### Push将元素加入链表栈
函数签名: ```go func (s *LinkedStack[T]) Push(value T) ``` 示例: ```go package main import ( "fmt" stack "github.com/duke-git/lancet/v2/datastructure/stack" ) func main() { sk := stack.NewLinkedStack[int]() sk.Push(1) sk.Push(2) sk.Push(3) fmt.Println(sk.Data()) //[]int{3, 2, 1} } ``` ### Pop删除栈顶元素并返回该元素指针
函数签名: ```go func (s *LinkedStack[T]) Pop() (*T, error) ``` 示例: ```go package main import ( "fmt" stack "github.com/duke-git/lancet/v2/datastructure/stack" ) func main() { sk := stack.NewLinkedStack[int]() sk.Push(1) sk.Push(2) sk.Push(3) val, err := sk.Pop() fmt.Println(err) //nil fmt.Println(*val) //3 fmt.Println(sk.Data()) //[]int{2, 1} } ``` ### Peak返回栈顶元素指针
函数签名: ```go func (s *LinkedStack[T]) Peak() (*T, error) ``` 示例: ```go package main import ( "fmt" stack "github.com/duke-git/lancet/v2/datastructure/stack" ) func main() { sk := stack.NewLinkedStack[int]() sk.Push(1) sk.Push(2) sk.Push(3) val, err := sk.Peak() fmt.Println(err) //nil fmt.Println(*val) //3 fmt.Println(sk.Data()) //[]int{3, 2, 1} } ``` ### Data返回栈中所有元素组成的切片
函数签名: ```go func (s *LinkedStack[T]) Data() []T ``` 示例: ```go package main import ( "fmt" stack "github.com/duke-git/lancet/v2/datastructure/stack" ) func main() { sk := stack.NewLinkedStack[int]() sk.Push(1) sk.Push(2) sk.Push(3) fmt.Println(sk.Data()) //[]int{3, 2, 1} } ``` ### Size返回栈中元素的数量
函数签名: ```go func (s *LinkedStack[T]) Size() int ``` 示例: ```go package main import ( "fmt" stack "github.com/duke-git/lancet/v2/datastructure/stack" ) func main() { sk := stack.NewLinkedStack[int]() sk.Push(1) sk.Push(2) sk.Push(3) fmt.Println(sk.Size()) //3 } ``` ### IsEmpty判断栈是否为空
函数签名: ```go func (s *LinkedStack[T]) IsEmpty() bool ``` 示例: ```go package main import ( "fmt" stack "github.com/duke-git/lancet/v2/datastructure/stack" ) func main() { sk := stack.NewLinkedStack[int]() fmt.Println(sk.IsEmpty()) //true sk.Push(1) sk.Push(2) sk.Push(3) fmt.Println(sk.IsEmpty()) //false } ``` ### Clear清空栈元素,使栈为空
函数签名: ```go func (s *LinkedStack[T]) Clear() ``` 示例: ```go package main import ( "fmt" stack "github.com/duke-git/lancet/v2/datastructure/stack" ) func main() { sk := stack.NewLinkedStack[int]() sk.Push(1) sk.Push(2) sk.Push(3) sk.Clear() fmt.Println(sk.Data()) //[]int{} } ``` ### Print打印链表栈结构
函数签名: ```go func (s *LinkedStack[T]) Print() ``` 示例: ```go package main import ( "fmt" stack "github.com/duke-git/lancet/v2/datastructure/stack" ) func main() { sk := stack.NewLinkedStack[int]() sk.Push(1) sk.Push(2) sk.Push(3) sk.Print() //[ &{Value:3 Next:0xc000010260}, &{Value:2 Next:0xc000010250}, &{Value:1 Next: