• 在Go中理解栈和先进先出原则


    Go是一种功能强大的编程语言,提供了丰富的数据结构和算法。堆栈是计算机科学中的基本数据结构之一。在本博文中,我们将探讨如何在 Go 中实现和使用堆栈,以及堆栈如何遵循先进先出 (FIFO) 原则。
    首先,让我们来看看堆栈是什么以及它是如何工作的。栈是一种线性数据结构,用于存储元素集合。堆栈的主要特点是遵循后进先出(LIFO)原则:最后一个添加到堆栈的元素是第一个被移除的元素。
    下面是一个如何在Go中实现简单堆栈的示例:

    package main
    
    import "fmt"
    
    type Stack []int
    
    func (s *Stack) Push(v int) {
        *s = append(*s, v)
    }
    
    func (s *Stack) Pop() int {
        res := (*s)[len(*s)-1]
        *s = (*s)[:len(*s)-1]
        return res
    }
    
    func main() {
        s := Stack{}
        s.Push(1)
        s.Push(2)
        s.Push(3)
        fmt.Println(s.Pop())
        fmt.Println(s.Pop())
        fmt.Println(s.Pop())
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这个示例中,我们定义一个新的Stack类型。然后我们在该类型上定义两个方法:Push和Pop。Push方法将一个新的元素追加到片段的末尾,而Pop方法则从片段中删除并返回最后一个元素。
    当我们运行这段代码时,我们可以看到元素从堆栈中移除的顺序与添加的顺序相反。这证明了堆栈的后进先出原则。
    现在让我们看看如何使用堆栈来实现先进先出(FIFO)原则。先进先出原则也被称为队列原则:元素按照添加的顺序被添加到队列的一端,并从另一端移除。
    使用堆栈实现队列的一种方法是使用两个堆栈:一个用于添加元素,另一个用于移除元素。下面是一个示例:

    package main
    
    import "fmt"
    
    type Queue struct {
        in  Stack
        out Stack
    }
    
    func (q *Queue) Enqueue(v int) {
        q.in.Push(v)
    }
    
    func (q *Queue) Dequeue() int {
        if len(q.out) == 0 {
            for len(q.in) > 0 {
                q.out.Push(q.in.Pop())
            }
        }
        return q.out.Pop()
    }
    
    func main() {
        q := Queue{}
        q.Enqueue(1)
        q.Enqueue(2)
        q.Enqueue(3)
        fmt.Println(q.Dequeue())
        fmt.Println(q.Dequeue())
        fmt.Println(q.Dequeue())
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    在这个示例中,我们定义了一个新的Queue类型,它包含两个Stack字段:in和out。然后,我们在该类型上定义两个方法:Enqueue和Dequeue。Enqueue方法向in栈中添加一个新元素,而Dequeue方法从out栈中删除并返回一个元素。
    当我们运行这段代码时,我们可以看到元素是按照添加的顺序从队列中移出的。这证明了队列的先进先出原则。
    总之,栈是一种遵循后进先出原则的基本数据结构。通过使用两个栈,我们也可以实现遵循先进先出原则的队列。Go提供了简单易用的语法来定义和处理这些数据结构。

  • 相关阅读:
    基于Python的视觉词袋实现数据分类
    RPC远程调用框架Dubbo
    CodeQL的自动化代码审计之路(上篇)
    7. Django 模型与数据库
    从求职惨败到阿里35w+offer,这位双非硕的经历太励志!
    【git】gitee的上传文件与报错
    scrapy实现分布式爬虫,scrapy-redis所遇到的问题,终端进入虚拟环境
    CTFSHOW 年CTF
    MATLAB神经网络编程(一)——感知器
    上网管理系统--帮助企业管理和分析员工上网行为
  • 原文地址:https://blog.csdn.net/m0_73728511/article/details/133940525