【算法笔记】stack的简单实践

2022-02-14  本文已影响0人  李明燮

今天用go语言简单的写了一下stack的方法。
为了以后方便查看,当做笔记整理了一下~~

1.栈(Stack)

维基百科里是这么解释的。

是计算机科学中的一种抽象资料类型,只允许在有序的线性资料集合的一端(称为堆栈顶端,英语:top)进行加入数据(英语:push)和移除数据(英语:pop)的运算。
因而按照后进先出(LIFO, Last In First Out)的原理运作。

具体的详解可以参考这篇文章里的Stack部分栈(STACK), 堆(HEAP), 队列(QUEUE) 是什么?

2.数组栈

struct

type Stack struct {
    Capacity int
    Top      int
    Values   []int
}

进栈(push)

func (s *Stack) Push(val int) bool {
    if s.Top >= s.Capacity {
        fmt.Println("Stack Overflow!")
        return false
    }
    s.Top++
    s.Values[s.Top] = val
    return true
}

出栈(pop)

func (s *Stack) Pop() int {
    if s.Top < 0 {
        fmt.Println("Stack Underflow!")
        return 0
    }
    result := s.Values[s.Top]
    s.Top--
    return result
}

查看栈顶元素(peek)和IsEmpty()

func (s *Stack) Peek() int {
    if s.Top < 0 {
        fmt.Println("Stack Underflow!")
        return 0
    }
    result := s.Values[s.Top]
    return result
}

func (s *Stack) IsEmpty() bool {
    return s.Top < 0
}

执行结果

func main() {
    stack := Stack{}
    stack.Capacity = 10
    stack.Top = -1
    stack.Values = make([]int, stack.Capacity)

    stack.Push(10)
    stack.Push(11)
    stack.Push(12)
    fmt.Println("-------- stack.Values  --------")
    fmt.Printf("%+v", stack.Values)
    fmt.Println("")
    fmt.Println("-------- stack.IsEmpty()  --------")
    fmt.Println(stack.IsEmpty())
    fmt.Println("-------- stack.Pop()  --------")
    fmt.Println(stack.Pop())
    fmt.Println("-------- stack.Peek()  --------")
    fmt.Println(stack.Peek())

执行结果为:

$ go run main.go
-------- stack.Values  --------
[10 11 12 0 0 0 0 0 0 0]
-------- stack.IsEmpty()  --------
false
-------- stack.Pop()  --------
12
-------- stack.Peek()  --------
11

3.链式栈

struct

type LinkStack struct {
    Top *StackNode
}

type StackNode struct {
    Value int
    Next  *StackNode
}

进栈(push)

func (s *LinkStack) Push(val int) bool {
    newNode := StackNode{Value: val}
    if s.Top == nil {
        s.Top = &newNode
    } else {
        newNode.Next = s.Top
        s.Top = &newNode
    }
    return true
}

出栈(pop)

func (s *LinkStack) Pop() int {
    if s.Top == nil {
        fmt.Println("stack is empty!")
        return -1
    }
    result := s.Top
    s.Top = result.Next
    return result.Value
}

查看栈顶元素(peek)和IsEmpty(),Print()

func (s *LinkStack) Peek() int {
    if s.Top == nil {
        fmt.Println("stack is empty!")
        return -1
    }
    return s.Top.Value
}

func (s *LinkStack) IsEmpty() bool {
    return s.Top == nil
}

func (node *StackNode) Print() {
    if node == nil || node.Value == 0 {
        return
    } else {
        fmt.Print(node.Value, " ")
        node.Next.Print()
    }
}

执行结果

func main() {
    linkStack := LinkStack{}
    linkStack.Top = &StackNode{Value: 10}
    linkStack.Top.Next = &StackNode{Value: 11}
    linkStack.Top.Next.Next = &StackNode{Value: 12}

    fmt.Println("-------- linkStack.Values  --------")
    linkStack.Top.Print()
    fmt.Println("")
    fmt.Println("-------- stack.IsEmpty()  --------")
    fmt.Println(linkStack.IsEmpty())
    fmt.Println("-------- stack.Pop()  --------")
    fmt.Println(linkStack.Pop())
    fmt.Println("-------- stack.Peek()  --------")
    fmt.Println(linkStack.Peek())
    fmt.Println("-------- linkStack.Values  --------")
    linkStack.Top.Print()
}

执行结果为:

$ go run main.go
-------- linkStack.Values  --------
10 11 12 
-------- stack.IsEmpty()  --------
false
-------- stack.Pop()  --------
10
-------- stack.Peek()  --------
11
-------- linkStack.Values  --------
11 12 

欢迎大家的意见和交流

email: li_mingxie@163.com

上一篇下一篇

猜你喜欢

热点阅读