golang 实现栈数据结构
package main
import "fmt"
const initSize int=20 //定义常量栈的初始大小initSize为20
//栈结构体Stack
type Stack struct{
size int //容量
top int //栈顶
data []interface{} //用切片data作容器,定义为interface{}类型的切片以接收任意类型
}
//创建并初始化栈方法createStack,返回Stack
func createStack() Stack{
s:=Stack{} //声明Stack变量s,注意:声明结构体变量得加{}
s.size=initSize
s.top=-1
s.data=make([]interface{},initSize)
return s
}
//操作Stack的方法isEmpty判断栈是否为空
func(s *Stack) isEmpty() bool{
return s.top==-1
}
func(s *Stack) isFull() bool{
return s.top==s.size-1
}
//入栈
func(s *Stack) push(e interface{}) bool{
if(s.isFull()){
fmt.Println("Stack is full,push failed")
return false
}
s.top++
s.data[s.top]=e
return true
}
//出栈
func(s *Stack) pop() interface{}{
if(s.isEmpty()){
fmt.Println("Stack is empty,pop failed")
return nil
}
e:=s.data[s.top]
s.top--
return e
}
//栈已有元素的长度
func(s *Stack) getLength() int{
length:=s.top+1
return length
}
//清空栈
func(s *Stack) clear(){
s.top=-1
}
//遍历栈
func(s *Stack) traverse(){
if(s.isEmpty()){
fmt.Println("Stack is empty")
}else{ //注意这里的else不能换到下一行
for i:=0;i<=s.top;i++{
fmt.Print(s.data[i]," ")
}
fmt.Println()
}
}
//打印栈的当前信息
func(s *Stack) printInfo(){
fmt.Println("###############################################")
fmt.Println("栈容量为:",s.size)
fmt.Println("栈顶指数为:",s.top)
fmt.Println("长度为:",s.getLength())
fmt.Println("栈是否为空:",s.isEmpty())
fmt.Println("栈是否为满:",s.isFull())
fmt.Print("遍历栈:")
s.traverse()
fmt.Println("###############################################")
}
func main(){
//初始情况测试
s:=createStack()
fmt.Println("栈创建成功:")
s.printInfo()
fmt.Println()
fmt.Println("---------------------------现在开始测试入栈-------------------------")
fmt.Println("用10个int测试入栈:")
for i:=0;i<10;i++{
s.push(i)
}
s.printInfo()
fmt.Println()
fmt.Println("再加10个string入栈:")
var str string="a"
for i:=10;i<20;i++{
s.push(str)
str+="a"
}
s.printInfo()
fmt.Println()
fmt.Println("此时栈已满,再加一个int入栈试试:")
s.push(21)
s.printInfo()
fmt.Println("-----------------------现在开始测试出栈----------------------------")
fmt.Println("先pop一个出栈顶试试")
fmt.Println("pop出的元素是:",s.pop())
s.printInfo()
fmt.Println()
fmt.Println("清空栈")
s.clear()
s.printInfo()
fmt.Println()
fmt.Println("再pop一个试试")
s.pop()
s.printInfo()
}