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日

相关文章

  • 一些常见的字符串匹配算法

    作者:京东零售 李文涛 一、简介 1.1 Background 字符串匹配在文本处理的广泛领域中是一个非常重要的主题。字符串匹配包括在文本中找到一个,或者更一般地说,所有字符串(通常来讲称其为模式)的出现。该模式表示为p=p[0..m-1];它的长度等于m。文本表示为t=t[0..n-1],它的长度等于n。两个字符串都建立在一个有限的字符集上。 一个比较常见…

    算法与数据结构 2023年4月25日
    00
  • C++数据结构之红黑树的实现

    《C++数据结构之红黑树的实现》是一篇介绍红黑树实现的文章,通过本文,你可以了解到什么是红黑树以及如何实现红黑树。 什么是红黑树 红黑树是一种自平衡的二叉查找树,它具有良好的平衡性和查找性能。红黑树可以在O(log n)的时间内完成查找、插入和删除操作。 红黑树的一个重要性质是它的任何一个节点都有一个颜色(红色或黑色)属性。在插入、删除操作中,需要通过一定的…

    数据结构 2023年5月17日
    00
  • C语言 结构体数组详解及示例代码

    C语言 结构体数组详解及示例代码 结构体是C语言中最为基础的数据结构之一,它可以将多个数据类型组合成一个整体,方便地进行访问和管理。而结构体数组则是将多个相同结构体类型的变量按照一定规律排列在一起的一种数据结构。本文将详细讲解C语言中结构体数组的使用方法及示例代码。 定义结构体 首先,我们需要定义一个结构体类型。结构体类型需要指定名称、成员变量及其数据类型:…

    数据结构 2023年5月17日
    00
  • 2021最新Android笔试题总结美团Android岗职能要求

    2021最新Android笔试题总结和美团Android岗职能要求 简介 本文主要介绍了2021最新的Android笔试题总结和美团Android岗职能要求,旨在为正在面试美团Android岗位的面试者提供参考。 笔试题总结 下面是近期美团Android面试中出现的一些笔试题目: 1. 请描述Android中BroadcastReceiver的生命周期。 安…

    数据结构 2023年5月17日
    00
  • 举例讲解C语言程序中对二叉树数据结构的各种遍历方式

    那么我们先来介绍一下二叉树。 什么是二叉树? 二叉树是一种树状的数据结构,它的每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树节点的定义如下: typedef struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NUL…

    数据结构 2023年5月17日
    00
  • 数据结构与算法之手撕排序算法

    数据结构与算法之手撕排序算法 本篇攻略介绍如何手撕常见的排序算法。 冒泡排序 冒泡排序是一种通过不断交换相邻元素来排序的方法。它的时间复杂度为$O(n^2)$。 def bubble_sort(nums): for i in range(len(nums)): for j in range(len(nums)-i-1): if nums[j] > nu…

    数据结构 2023年5月17日
    00
  • C语言链表详解及代码分析

    C语言链表详解及代码分析 简介 链表是一种常见的数据结构,它主要用于存储线性数据结构,可以动态地进行添加和删除操作。在C语言中,链表可以通过链式存储结构来实现。本篇攻略将详细讲解C语言链表的实现,包括定义链表、节点、添加节点、删除节点等操作。 链表的定义 链表由一个个节点组成,每个节点包含两个信息:数据和指向下一个节点的指针。在C语言中,可以通过结构体实现每…

    数据结构 2023年5月17日
    00
  • 数据结构 双向链表的创建和读取详解及实例代码

    下面我为你详细讲解“数据结构 双向链表的创建和读取详解及实例代码”的完整攻略。 什么是双向链表? 双向链表是一种常见的线性数据结构,与单向链表相比,它可以在节点之间建立双向连接,使得在需要反向遍历链表时效率更高。每个节点同时保存了指向前一个节点和后一个节点的指针,因此双向链表也叫做双链表。 双向链表的创建 定义节点类 首先,我们需要定义一个表示节点的类,该类…

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