热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Golang数组如何实现stack和queue数据结构

这期内容当中小编将会给大家带来有关Golang数组如何实现stack和queue数据结构,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望

这期内容当中小编将会给大家带来有关Golang数组如何实现stack和queue数据结构,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

  • 栈是一系列对象的组成的集合,具有先进后出的原则。

栈是最简单的数据结构也是最重要的数据结构,它的增删查看都是在栈顶操作的,它具有以下属性:

  1. s.push(e) : 将一个e元素添加到栈顶;

  2. s.pop(): 在stack中删除栈顶元素并且返回;

  3. s.isEmpty(): 如果栈为空,返回true

  4. s.len(): 返回栈的长度

  5. s.top(): 返回栈顶数据

下面用数组实现栈:

package main
import (
  "errors"
  "fmt"
)

var (
  stackIsNil = errors.New("empty stack")
)

type stack []int
// Push 往stack顶部插入数据
func (s *stack) Push(e int) {
  *s = append(*s, e)
  return
}

// Pop 删除stack顶部数据并且返回删除的数据
func (s *stack) Pop() (ret int, err error) {
  if len(*s) == 0 {
     return 0, stackIsNil
  }

  temp := *s
  ret = temp[len(temp)-1]
  temp = temp[:len(temp)-1]
  *s = temp
  return
}

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

// Top 获取stack顶部数据
func (s *stack) Top() (int, error) {
  if len(*s) == 0 {
     return 0, stackIsNil
  }
  temp := *s
  return temp[len(temp)-1], nil
}

// Len 获取stack长度
func (s *stack) Len() int {
  return len(*s)
}

func main() {
  s := new(stack)
  // 插入1
  s.Push(1)
  // 插入2
  s.Push(2)
  // 插入5
  s.Push(5)
  // 获取长度
  fmt.Println(s.Len()) // 3
  // 获取stack顶部数据
  fmt.Println(s.Top()) // 5
  // 删除顶部数据
  fmt.Println(s.Pop()) // 5
  // 获取长度
  fmt.Println(s.Len()) // 2
  // 判断是否为空stack
  fmt.Println(s.IsEmpty())
}
  • 队列也是一系列对象组成的集合,它具有先进先出的原则。

队列的特点是访问和删除限制在队列的第一个元素,插入被限制在队列的尾部,队列的属性:

  1. q.enqueue(e): 向队列尾部插入一个元素;

  2. q.dequeue(): 删除并且返回第一个元素,如果队列为空则报错;

  3. q.first(): 不删除元素,直接返回第一个元素,如果为空则报错;

  4. q.isEmpty(): 队列为空返回true;

  5. q.len(): 返回队列长度。

  数组实现队列代码:

package main
import (
  "errors"
  "fmt"
)

var (
  ErrNilQueue = errors.New("queue is nil")
)

type queue []int
// Enqueue 队列尾部插入数据
func (q *queue) Enqueue(e int) {
  *q = append(*q, e)
}

// Dequeue 队列删除第一个元素
func (q *queue) Dequeue() (ret int, err error) {
  if len(*q) == 0 {
     err = ErrNilQueue
     return
  }
  temp := *q
  ret = temp[0]
  temp = temp[1:]
  *q = temp
  return
}

// First 返回第一个数据
func (q *queue) First() (ret int, err error) {
  if len(*q) == 0 {
     err = ErrNilQueue
     return
  }
  temp := *q
  ret = temp[0]
  return
}

func (q *queue) IsEmpty() bool {
  return len(*q) == 0
}

func (q *queue) Len() int {
  return len(*q)
}

func main() {
  q := new(queue)
  q.Enqueue(1)
  q.Enqueue(10)
  q.Enqueue(20)
  fmt.Println(q.First())   // 1
  fmt.Println(q.Dequeue()) // 1
  fmt.Println(q.First())   // 10
  fmt.Println(q.IsEmpty()) // false
  fmt.Println(q.Len())     // 2
  fmt.Println(q.Dequeue()) //10
  fmt.Println(q.Len())     // 1
}

上述就是小编为大家分享的Golang数组如何实现stack和queue数据结构了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程笔记行业资讯频道。


推荐阅读
  • RingBuffer,或者说CircularBuffer,是一个长度固定的缓冲区,当从一端插入元素超过指定的最大长度时,缓冲区另一端的元素 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • 一、死锁现象与递归锁进程也是有死锁的所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作 ... [详细]
  • 怎么编译并运行golang程序
    怎么编译并运行golang程序?刚入门的朋友还不知道怎么编译运行golang程序,通过这篇文章的总结,希望你能学会书写你的第一个go语言程序。首先我们 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 本文介绍了一道经典的状态压缩题目——关灯问题2,并提供了解决该问题的算法思路。通过使用二进制表示灯的状态,并枚举所有可能的状态,可以求解出最少按按钮的次数,从而将所有灯关掉。本文还对状压和位运算进行了解释,并指出了该方法的适用性和局限性。 ... [详细]
  • python中安装并使用redis相关的知识
    本文介绍了在python中安装并使用redis的相关知识,包括redis的数据缓存系统和支持的数据类型,以及在pycharm中安装redis模块和常用的字符串操作。 ... [详细]
  • C++ STL复习(13)容器适配器
    STL提供了3种容器适配器,分别为stack栈适配器、queue队列适配器以及priority_queue优先权队列适配器。不同场景下,由于不同的序列式 ... [详细]
  • java线程池的实现原理源码分析
    这篇文章主要介绍“java线程池的实现原理源码分析”,在日常操作中,相信很多人在java线程池的实现原理源码分析问题上存在疑惑,小编查阅了各式资 ... [详细]
  • 题目链接:ProductBo思想很好,挺有趣的题,在床上突然会做的。#include<bitsstdc++.h>usingnamespacestd;typede ... [详细]
  • 20220811:以下go语言代码输出什么?A:panic;B:编译错误;C:json marshal 报错
    2022-08-11:以下go语言代码输出什么?A:panic;B:编译错误;C:jsonmarshal报错;D:null;E:nil。packagemainimport(enc ... [详细]
author-avatar
mobiledu2502871343
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有