Skip to content
本页内容

# 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/linkedstack.go

## 用法 ​

go

    import (
        stack "github.com/duke-git/lancet/v2/datastructure/stack"
    )

    import (
        stack "github.com/duke-git/lancet/v2/datastructure/stack"
    )

## 目录 ​

### 1. ArrayStack（数组栈） ​

- NewArrayStack
- Push
- Pop
- Peak
- Data
- Size
- IsEmpty
- Clear

### 2. LinkedStack（链表栈） ​

- NewLinkedStack
- Push
- Pop
- Peak
- Data
- Size
- IsEmpty
- Clear
- Print

## 文档 ​

### 1. ArrayStack ​

用切片实现栈结构

### NewArrayStack ​

返回ArrayStack指针实例

函数签名:

go

    type ArrayStack[T any] struct {
    	data   []T
    	length int
    }
    func NewArrayStack[T any]() *ArrayStack[T]

    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)
    }

    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)

    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}
    }

    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)

    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}
    }

    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)

    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}
    }

    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

    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}
    }

    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

    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
    }

    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

    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
    }

    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()

    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{}
    }

    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]

    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)
    }

    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)

    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}
    }

    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)

    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}
    }

    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)

    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}
    }

    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

    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}
    }

    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

    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
    }

    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

    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
    }

    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()

    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{}
    }

    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()

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

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