Liu Guang

Go实现链式栈

Liuguang   2022-07-07 13:22:49

栈的结构比较简单,特别是采用链式结构实现,栈是一种先进后出的存储结构,通常分为入栈、出栈、获取栈顶元素等操作。

1、定义栈结构

package main

import "fmt"

type StackNode struct {
    data interface{}
    next *StackNode
}

var LinkStack *StackNode

栈结点包括数据域和指针域,并定义一个指向第一个结点的指针LinkStack,由于栈结构中没有头结点,本指针直接指向栈顶,作为栈顶指针使用。

2、初始化栈

//初始化栈,由于无头结点,直接赋值S=nil
func (S *StackNode) InitStack() *StackNode {
    //初始化的时候没有new,后面所有的操作只是副本吗??
    LinkStack = nil
    return LinkStack
}

3、入栈操作

//入栈操作
func (S *StackNode) Push(data interface{}) {
    //生成新结点
    stackNode := StackNode{data: data, next: nil}
    //将新结点插入栈顶
    stackNode.next = LinkStack
    //修改栈顶指针为stackNode
    LinkStack = &stackNode
}

4、出栈操作

//出栈操作
func (S *StackNode) Pop() bool {
    if LinkStack == nil {
        fmt.Println("no data")
        return false
    } else {
        LinkStack = LinkStack.next
        return true
    }
}

5、获取栈顶元素

//获取栈顶元素
func (S *StackNode) GetTop() (interface{}, bool) {
    if LinkStack != nil {
        return LinkStack.data, true
    } else {
        fmt.Println("no data")
        return nil, false
    }

}

6、主函数

func main() {
    LinkStack.InitStack()
    LinkStack.Push(100)
    LinkStack.Push(200)
    LinkStack.Push(300)
    fmt.Println("取栈顶元素")
    d1, ok := LinkStack.GetTop()
    if ok {
        fmt.Println(d1)
    }
    fmt.Println("Pop栈顶元素后,再取栈顶元素")
    LinkStack.Pop()
    d2, ok := LinkStack.GetTop()
    if ok {
        fmt.Println(d2)
    }
}

7、运行结果

取栈顶元素
300
Pop栈顶元素后,再取栈顶元素
200

Related Articles

0 Comments

message
沪ICP备17044897号-3 © 2022 Phpangel Xu - GitHub
Login