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