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

 更新时间:2023年04月13日 09:51:03   作者:陪我去看海  
在计算机科学中,stack(栈)是一种基本的数据结构,它是一种线性结构,具有后进先出(Last In First Out)的特点。本文将通过Golang实现堆栈,需要的可以参考一下

前言

始于此篇,为了学习 Golang 基础,采用了使用 Golang 实现各种数据结构,以此来和 Golang 交朋友,今天的主题就是 把Stack介绍给Golang认识

源码:Stack

介绍Stack

在计算机科学中,stack(栈)是一种基本的数据结构,它是一种线性结构,具有后进先出(Last In First Out)的特点。

上述是通过对 ChatGPT 提问:数据结构stack。所得到的答案,我们这里拿出这句话的关键词:线性结构,后进先出。了解之后它的特性之后,应该如何实现呢,它应该包含哪些操作才叫stack呢?

通过ChatGPT的回答,我们可以知道我们需要实现的stack包含以下方法:

  • Push
  • Pop
  • Peek
  • Len
  • Cap
  • Clear

那就开始吧!

Stack

在 Golang 中,使用 struct结构体可以模拟出栈的结构,分别有存储元素的空间,栈的长度,栈的容量

type Element interface{}

type Stack struct {
	elements []Element
	top   int // 栈顶指针
	cap      int // 容量
}

Push

作用:Push 方法就是往stack的存储区域压入新的元素

// Push
func (stack *Stack) Push(element Element) (err error) {
	// top == cap时,栈满
	if stack.top >= stack.cap {
		return errors.New("the stack is full")
	}
	stack.elements[stack.top] = element
	stack.top++
	return nil
}

Pop

作用:Pop 方法是取出栈顶元素,并且在存储区域内删除

// Pop
func (stack *Stack) Pop() (ele Element, err error){
	// top == 0时,栈空
	if stack.top <= 0 {
		return nil, errors.New("the stack is empty")
	}
	ele = stack.elements[stack.top]
	// 在栈中清除当前元素
	stack.elements = append(stack.elements, stack.elements[:stack.top], stack.elements[stack.top+1:])
	stack.top--
	return ele, nil
}

Peek

作用:Peek 方法就是返回栈顶的值,但是不删除存储区域的元素

// Peek
func (stack *Stack) Peek() (ele Element, err error){
	if stack.top <= 0 {
		return nil, errors.New("the stack is empty")
	}
	ele = stack.elements[stack.top]
	return ele, nil
}

Len & Cap & Clear

  • Len:返回栈的存储的元素个数
  • Cap:当前栈的容量
  • Clear:将栈清空
// Len
func (stack *Stack) Len() int{
	return stack.top
}

// Cap
func (stack *Stack) Cap() int{
	return stack.cap
}

// Clear
func (stack *Stack) Clear() {
	if stack.top <= 0 {
		return
	}
	// 重新分配一个空切片
	stack.elements = stack.elements[:0]
	stack.top = 0
}

为了方便使用,还可以提供一个创建栈的方法:NewStack

NewStack

// 初始化栈
func NewStack(cap int) *Stack {
	elements := make([]Element, cap)
	return &Stack{
		elements: elements,
		top:   0,
		cap:      cap,
	}
}

使用

package main

import "fmt"

func main() {
	stack := NewStack(5)
	for i := 0; i < 4; i++ {
		var ele Element = i
		stack.Push(ele)
	}

	element, _ := stack.Pop()
	fmt.Println(element)

	peekEle, _ := stack.Peek()
	fmt.Println(peekEle)

	fmt.Println(stack.Len())
	fmt.Println(stack.Cap())

	stack.Clear()
}

以上就是Golang实现数据结构Stack(堆栈)的示例详解的详细内容,更多关于Golang数据结构Stack的资料请关注脚本之家其它相关文章!

相关文章

  • Go 函数返回nil遇到问题避坑分析

    Go 函数返回nil遇到问题避坑分析

    这篇文章主要为大家介绍了Go 函数返回nil遇到的避坑问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Go语言defer语句的三种机制整理

    Go语言defer语句的三种机制整理

    在本篇文章里小编给大家分享的是一篇关于Go语言defer语句的三种机制整理,需要的朋友们学习下吧。
    2020-03-03
  • GoFrame错误处理常用方法及错误码使用示例

    GoFrame错误处理常用方法及错误码使用示例

    这篇文章主要为大家介绍了GoFrame错误处理常用方法及错误码使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go Redis客户端使用的两种对比

    Go Redis客户端使用的两种对比

    这篇文章主要为大家介绍了Go Redis客户端使用对比详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Go目录文件路径操作的实现

    Go目录文件路径操作的实现

    在Go语言中,可以使用绝对路径或相对路径来表示文件路径,本文就来介绍一下Go目录文件路径操作,感兴趣的可以了解一下
    2023-10-10
  • Golang服务的请求调度的实现

    Golang服务的请求调度的实现

    Golang服务请求调度是一种使用Go语言实现的服务请求管理方法,本文主要介绍了Golang服务的请求调度的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • Golang反射修改变量值的操作代码

    Golang反射修改变量值的操作代码

    这篇文章主要介绍了Golang反射修改变量值,也就是Golang反射三大定律中的前两个,即从interface{}到反射对象和从反射对象到interface{},需要的朋友可以参考下
    2022-12-12
  • golang中拿slice当queue和拿list当queue使用分析

    golang中拿slice当queue和拿list当queue使用分析

    这篇文章主要为大家介绍了golang 中拿slice当queue和拿list当queue使用分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • go module构建项目的实现

    go module构建项目的实现

    本文主要介绍了go module构建项目的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Go语言实现对XML的读取和修改

    Go语言实现对XML的读取和修改

    这篇文章主要为大家详细介绍了Go语言实现对XML的读取和修改的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12

最新评论