编程语言
首页 > 编程语言> > 数据结构与算法基础-Go语言版-2.栈

数据结构与算法基础-Go语言版-2.栈

作者:互联网

目录

前言

一、栈的定义及特点?

二、栈的实现

2.1 顺序栈

2.1.1 顺序栈的结构定义

2.1.2 顺序栈的初始化

2.1.3 判断栈空与栈满

2.1.4 入栈

2.1.5 出栈

2.1.6 预览栈顶元素

2.2 链栈

2.2.1 链栈的结构定义

2.2.2 链栈的初始化

2.1.3 判断栈空

2.2.4 入栈(此处使用的是链表的头插法)

2.2.5 出栈

三、练习

3.1 进制转换,设计一个函数,要求输入一个10进制数,可以输出转换成对应进制的数。

3.2 括号匹配,输入任意数量只含括号的字符串,函数能判断字符串中括号的数量及类型是否匹配

3.3 逆波兰表达式,要求输入中缀表达式,输出后缀表达式

总结



前言

本文将会系统介绍栈的结构及其特点,同时给出go语言如何实现顺序结构和链式结构的栈,最后使用顺序栈来完成几道习题。


一、栈的定义及特点?


二、栈的实现


2.1 顺序栈

2.1.1 顺序栈的结构定义

2.1.2 顺序栈的初始化

func initStack(size int)*stack{
    return &stack{
        top:0,
        base:0,
        container:make([]int,size,size), //这里有两种方式,一种是定义长度为0,入栈时用append()函数追加,但是在弹栈时要相应抹去底层数组的值,比较麻烦,一种是定义长度为size,入栈时直接索引赋值
        length:0,
        size:size,
    }
}

2.1.3 判断栈空与栈满

func (s *stack)isValid()bool{
    return s.length==0
}

func (s *stack)isFull()bool{
    return s.length==s.size
}

2.1.4 入栈

func (s *stack)push(data int)error{
    if s.isFull(){
        return errors.New("the stack is full,can not push any value\n")
    }
    s.container[s.top]=data //往表尾(既栈顶)追加元素
    s.top++ // 保持top指向栈顶元素的下一个位置
    s.length++ 
    return nil
}

2.1.5 出栈

func (s *stack)pop()(int,error){
    if s.isValid(){
        return -1,errors.New("the stack is valid,can not pop any value\n")
    }
    s.top--  // 先将top指向当前栈顶元素
    s.length-- 
    return s.container[s.top],nil
}

2.1.6 预览栈顶元素

func (s *stack)peek()string{
    return s.container[top-1]
}


2.2 链栈

2.2.1 链栈的结构定义

type sNode struct{
    data int
    next *sNode
}

func newSNode(data int)*sNode{
    return &sNode{
        data:data,
        next:nil,
    }
}

type lStack struct{
    top *sNode //top指针指向链表头节点,不存放数据,头节点始终指向栈顶元素
    length int
}

2.2.2 链栈的初始化

// 链栈的初始化
func initLStack()*lStack{
    return &lStack{
        top:newSNode(-1),
        length:0,
    }
}

2.1.3 判断栈空

// 判断链栈是否为空
func (ls *lStack)isValid()bool{
    return ls.length==0
}

2.2.4 入栈(此处使用的是链表的头插法)

// 链栈入栈
func (ls *lStack)push(data int){
    temp := newSNode(data)
    temp.next =ls.top.next
    ls.top.next=temp
    ls.length++
}

2.2.5 出栈

// 链栈出栈
func (ls *lStack)pop()(int,error){
    if ls.isValid(){
        return -1,errors.New("the stack is valid,can not pop any value\n")
    }
    result := ls.top.next
    ls.top.next = result.next
    result.next = nil
    ls.length--
    return result.data,nil
    
}

三、练习

3.1 进制转换,设计一个函数,要求输入一个10进制数,可以输出转换成对应进制的数。

3.2 括号匹配,输入任意数量只含括号的字符串,函数能判断字符串中括号的数量及类型是否匹配

3.3 逆波兰表达式,要求输入中缀表达式,输出后缀表达式



总结

以上就是使用go语言构建栈并进行一些相关应用的介绍。如果有错希望大家能够纠正。

生命不息,coding不止!

标签:return,temp,int,result,Go,2.1,数据结构,data,语言版
来源: https://blog.csdn.net/qq_41736299/article/details/121404826