# 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:}, ] } ```