Golang实现数据结构Stack(堆栈)的示例详解

Golang实现数据结构Stack(堆栈)的示例详解

什么是Stack?

Stack,也称为堆栈,是一种先进后出(Last In First Out, LIFO)的数据结构。举个例子,比如一堆书,你按照一定的顺序叠起来,然后你想要拿出第一本,你需要先拿掉上面的书才能取到下面的。这就是典型的堆栈模型。

在编程中,Stack也是一种非常常见的数据结构,特别是在函数调用中,它经常被用来存储返回地址和局部变量等信息。

Golang实现Stack

用Slice实现Stack

在Golang中,可以利用Slice来实现Stack。我们先来看一下Slice的基本操作:

// 创建一个Slice
s := make([]int, 0)

// 往Slice中添加元素
s = append(s, 1)
s = append(s, 2)
s = append(s, 3)

// 获取Slice的长度和容量
fmt.Println(len(s)) // 输出:3
fmt.Println(cap(s)) // 输出:4

// 遍历Slice
for i := 0; i < len(s); i++ {
    fmt.Println(s[i])
}

接下来,我们可以通过在Slice的尾部追加和删除元素来实现Stack的基本操作。具体地,我们定义一个Stack结构体:

type Stack struct {
    s []int
}

// 往Stack里添加元素
func (stack *Stack) Push(v int) {
    stack.s = append(stack.s, v)
}

// 从Stack里弹出元素
func (stack *Stack) Pop() int {
    res := stack.s[len(stack.s)-1]
    stack.s = stack.s[:len(stack.s)-1]
    return res
}

// 判断Stack是否为空
func (stack *Stack) IsEmpty() bool {
    return len(stack.s) == 0
}

// 获取Stack的长度
func (stack *Stack) Size() int {
    return len(stack.s)
}

我们可以用Stack的Push方法往Stack里添加元素,用Pop方法从Stack里弹出元素。下面是一个简单的示例:

func main() {
    stack := &Stack{}
    stack.Push(1)
    stack.Push(2)
    stack.Push(3)
    for !stack.IsEmpty() {
        fmt.Println(stack.Pop())
    }
}

输出:

3
2
1

用List实现Stack

Golang也提供了标准库container/list来实现Stack。list里有PushBack、PushFront、Remove等方法可以方便地操作Stack。下面是一个示例:

import (
    "container/list"
    "fmt"
)

func main() {
    l := list.New()
    l.PushBack(1)
    l.PushBack(2)
    l.PushBack(3)
    for e := l.Back(); e != nil; e = e.Prev() {
        fmt.Println(e.Value.(int))
    }
}

输出:

3
2
1

上面的代码定义了一个List,通过PushBack方法往List里添加元素,通过Back方法获取List的尾部元素,在循环中依次遍历List。这个示例相比于使用Slice实现Stack来说更优雅,但如果你的代码已经使用了Slice实现Stack,没有必要刻意地引入一个新的库来实现相同的效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Golang实现数据结构Stack(堆栈)的示例详解 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C利用语言实现数据结构之队列

    C语言实现队列的完整攻略 什么是队列 队列是一种线性数据结构,它有两个端点:队头和队尾。新的元素插入到队尾,每次从队头取出一个元素。这就类似于人们排队买票,新的买票者排在队尾,每当售票员完成一笔交易,队列头的买票者出队。 基本操作 队列主要有以下3个基本操作: 入队(enqueue):将一个元素添加到队列的尾部 出队(dequeue):从队列的头部移除一个元…

    数据结构 2023年5月17日
    00
  • C语言数据结构之栈简单操作

    C语言数据结构之栈简单操作 什么是栈? 栈(Stack)是一种线性数据结构,它具有“后进先出”(Last-In-First-Out)的特性。栈顶是栈的一端,另一端称为栈底。每次只能从栈顶插入数据(入栈)或者从栈顶取出数据(出栈)。 栈的简单操作 栈的简单操作包括: 初始化栈 判断栈是否为空 判断栈是否已满 入栈操作 出栈操作 获取栈顶元素 栈的初始化 栈的初…

    数据结构 2023年5月16日
    00
  • Python描述数据结构学习之哈夫曼树篇

    Python描述数据结构学习之哈夫曼树篇攻略 简介 本篇攻略旨在介绍哈夫曼树的概念、构建方法和应用场景,并结合Python代码进行演示。 哈夫曼树概念 哈夫曼树(Huffman Tree)又称最优树,它是一种带权路径长度最短的树。所谓带权路径长度,就是每个节点的权值乘以其到根节点的路径长度(即树的层数)之和。哈夫曼树广泛应用于数据压缩领域。 哈夫曼树构建方法…

    数据结构 2023年5月17日
    00
  • Java数据结构之优先级队列(PriorityQueue)用法详解

    Java数据结构之优先级队列(PriorityQueue)用法详解 什么是优先级队列? 优先级队列(Priority Queue)是一种特殊的队列,它能够保证每次取出的元素都是优先级最高(或者最低)的元素。在实际应用中,优先级队列经常用来实现任务调度,负载均衡等。 Java中的优先级队列 在Java中,优先级队列实现了Queue接口,所以它也具有队列的基本特…

    数据结构 2023年5月17日
    00
  • Android随手笔记44之JSON数据解析

    Android随手笔记44之JSON数据解析 1. JSON数据的基本概念 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于 JavaScript 的一个子集。JSON 格式最初是为了解决 JavaScript 程序通过 AJAX 传输数据时的数据交换格式问题而出现的,但是现在已经成为了一种通用的数据格式。…

    数据结构 2023年5月17日
    00
  • 从零学JSON之JSON数据结构

    从零学JSON之JSON数据结构 什么是JSON? JSON全称为JavaScript Object Notation,即JavaScript对象表示法。它是一种轻量级的数据交换格式,具有可读性高、易于开发和解析的特点。JSON格式通常用于客户端和服务器之间的数据传输,可以支持多种编程语言。如下是一个简单的JSON格式示例: { "name&quo…

    数据结构 2023年5月17日
    00
  • redis数据结构之intset的实例详解

    Redis数据结构之intset的实例详解 介绍 Redis是一个高性能的key-value存储系统,支持多种数据结构。其中,intset是Redis内置的一种特殊的数据结构,它可以高效地存储整型数据。 本篇文章将介绍intset的基本特性、底层实现以及相关用例,以便读者能够更好地了解该数据结构在Redis中的应用。 intset的基本特性 intset是一…

    数据结构 2023年5月17日
    00
  • Python数据结构之双向链表详解

    Python数据结构之双向链表详解 什么是双向链表? 在计算机科学中,双向链表是链表的一种,每个结点除了储存下一个结点的指针外,还储存着前一个结点的指针。这个“前进”指针被称为“ next指针”,而“后退”指针被称为“previous指针”。 双向链表和单向链表的区别在于,单向链表的每个结点只储存一个指向下一个结点的指针,而双向链表储存了前一个和后一个结点的…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部