package main
import (
"fmt"
"strconv"
)
/**
栈:限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶(top)
对栈的基本操作有push(进栈)和pop(出栈)。
基本算法:
进栈(push):
1.若top>=n时,作出错误处理(进栈前先检查栈是否已满,满则溢出,不满则进入2)
2.置top = top + 1(栈指针加1,指向进栈地址)
3.s(top) = x ,结束(x为新进栈的元素)
出栈(pop):
1.若top <=0,则给出下溢信息,作出错处理(出栈前先检查栈是否为空,空则下溢,不空走2)
2.x = s(top),出栈后的元素赋值给x
3.top = top -1 ,栈指针减1,指向栈顶
*/
// 定义常量栈的初始大小
const initSize int = 20
// 栈结构体
type Stack struct {
// 容量
size int
// 栈顶
top int
// 用slice作容器,定义为interface{}
data []interface{}
}
// 创建并初始化栈,返回strck
func createStack() Stack {
s := Stack{}
s.size = initSize
s.top = -1
s.data = make([]interface{}, initSize)
return s
}
// 判断栈是否为空
func (s *Stack) IsEmpty() bool {
return s.top == -1
}
// 判断栈是否已满
func (s *Stack) IsFull() bool {
return s.top == s.size - 1
}
// 入栈
func (s *Stack) Push(data interface{}) bool {
// 首先判断栈是否已满
if s.IsFull() {
fmt.Println("stack is full, push failed")
return false
}
// 栈顶指针+1
s.top++
// 把当前的元素放在栈顶的位置
s.data[s.top] = data
return true
}
// pop,返回栈顶元素
func (s *Stack) Pop() interface{} {
// 判断是否是空栈
if s.IsEmpty() {
fmt.Println("stack is empty , pop error")
return nil
}
// 把栈顶的元素赋值给临时变量tmp
tmp := s.data[s.top]
// 栈顶指针-1
s.top--
return tmp
}
// 栈的元素的长度
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")
}
for i := 0 ; i <= s.top; i++ {
fmt.Println(s.data[i], " ")
}
}
// 打印当前栈的信息
func (s *Stack) PrintInfo() {
fmt.Println("栈容量:", s.size)
fmt.Println("栈顶指针:", s.top)
fmt.Println("栈元素长度:", s.GetLength())
fmt.Println("栈是否为空:", s.IsEmpty())
fmt.Println("栈是否已满:", s.IsFull())
fmt.Println("========遍历======")
s.Traverse()
fmt.Println("=========遍历结束========")
}
func main() {
s := createStack()
s.PrintInfo()
fmt.Println("===========push====")
for i := 0; i < 10; i++ {
s.Push(i)
}
s.PrintInfo()
str := "str_"
for i := 0; i < 20; i++ {
s.Push(str + strconv.Itoa(i))
}
s.Pop()
s.Clear()
s.PrintInfo()
}
go实现栈
猜你喜欢
转载自blog.csdn.net/u010918487/article/details/86989204
今日推荐
周排行