栈(Stack)
- 栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样的操作很快,而且容易实现
- 先进后出
初级实现
package StackArray
// 实现栈基于数组
type StackArray interface {
Clear()//清空栈
Size() int//栈的大小
Pop() interface{}//出栈
Push(data interface{}) //入栈
IsFull()bool//是否栈满了
IsEmpty()bool//是否空栈
}
type Stack struct {
dataSource [] interface{}
capsize int//最大范围
currentSize int//当前实际使用大小
}
func NewStack()* Stack {
myStack := new(Stack)
myStack.dataSource = make([]interface{}, 0, 10)
myStack.capsize = 10//最大空间
myStack.currentSize = 0//当前使用空间
return myStack
}
//清空栈
func (myStack * Stack)Clear() {
myStack.dataSource = make([]interface{}, 0, 10)
myStack.capsize = 10//最大空间
myStack.currentSize = 0//当前使用空间
}
//栈的大小
func (myStack * Stack)Size() int {
return myStack.currentSize
}
//出栈
func (myStack * Stack)Pop() interface{} {
if !myStack.IsEmpty() {
last := myStack.dataSource[myStack.currentSize - 1]//最后一个数据
myStack.dataSource = myStack.dataSource[:myStack.currentSize - 1]//删除最后一个
myStack.currentSize--
return last
}
return nil
}
//入栈
func (myStack * Stack)Push(data interface{}) {
if !myStack.IsFull() {
myStack.dataSource = append(myStack.dataSource, data)
myStack.currentSize++
}
}
//是否栈满了
func (myStack * Stack)IsFull()bool {
return myStack.currentSize >= myStack.capsize
}
//是否空栈
func (myStack * Stack)IsEmpty()bool {
if myStack.currentSize == 0 {
return true
} else {
return false
}
}
- 使用
package main
import (
"godemo01/StackArray"
"fmt"
)
func main() {
myStack := StackArray.NewStack()
myStack.Push(1)
myStack.Push(2)
myStack.Push(3)
myStack.Push(4)
fmt.Println(myStack.Size())// 4
fmt.Println(myStack.IsFull())// false
fmt.Println(myStack.IsEmpty())// false
fmt.Println(myStack.Pop())// 4
fmt.Println(myStack.Pop())// 3
fmt.Println(myStack.Pop())// 2
fmt.Println(myStack.Pop())// 1
fmt.Println(myStack.IsFull())//false
fmt.Println(myStack.IsEmpty())// true
fmt.Println(myStack.Size())
}
迭代式开发,关联之前的数组实现
- 层级应用,进行包装
package ArrayList
// 实现栈基于数组
type StackArray interface {
Clear()//清空栈
Size() int//栈的大小
Pop() interface{}//出栈
Push(data interface{}) //入栈
IsFull()bool//是否栈满了
IsEmpty()bool//是否空栈
}
type Stack struct {
myArray *ArrayList
capsize int//最大范围
}
func NewArrayListStack()* Stack {
myStack := new(Stack)
myStack.myArray = NewArrayList()//使用数组方法
myStack.capsize = 10//最大空间
return myStack
}
//清空栈
func (myStack * Stack)Clear() {
myStack.myArray.Clear()//用数组的方法
myStack.capsize = 10//最大空间
}
//栈的大小
func (myStack * Stack)Size() int {
return myStack.myArray.TheSize
}
//出栈
func (myStack * Stack)Pop() interface{} {
if !myStack.IsEmpty() {
last := myStack.myArray.dataStore[myStack.myArray.TheSize - 1]//最后一个数据
myStack.myArray.Delete(myStack.myArray.TheSize - 1)//删除最后一个
return last
}
return nil
}
//入栈
func (myStack * Stack)Push(data interface{}) {
if !myStack.IsFull() {
myStack.myArray.Append(data)
}
}
//是否栈满了
func (myStack * Stack)IsFull()bool {
return myStack.myArray.TheSize >= myStack.capsize
}
//是否空栈
func (myStack * Stack)IsEmpty()bool {
if myStack.myArray.TheSize == 0 {
return true
} else {
return false
}
}
- 使用
package main
import (
"godemo01/ArrayList"
// "godemo01/StackArray"
"fmt"
)
func main() {
myStack := ArrayList.NewArrayListStack()
myStack.Push(1)
myStack.Push(2)
myStack.Push(3)
myStack.Push(4)
fmt.Println(myStack.Size())// 4
// myStack.Clear()
fmt.Println(myStack.IsFull())// false
fmt.Println(myStack.IsEmpty())// false
fmt.Println(myStack.Pop())// 4
fmt.Println(myStack.Pop())// 3
fmt.Println(myStack.Pop())// 2
fmt.Println(myStack.Pop())// 1
fmt.Println(myStack.IsFull())//false
fmt.Println(myStack.IsEmpty())// true
fmt.Println(myStack.Size())
}
迭代器封装栈
package ArrayList
// 实现栈基于数组
type StackArrayX interface {
Clear()//清空栈
Size() int//栈的大小
Pop() interface{}//出栈
Push(data interface{}) //入栈
IsFull()bool//是否栈满了
IsEmpty()bool//是否空栈
}
type StackX struct {
myArray *ArrayList
Myit Iterator
}
func NewArrayListStackX()* StackX {
myStack := new(StackX)
myStack.myArray = NewArrayList()//使用数组方法
myStack.Myit = myStack.myArray.Iterator()//迭代
return myStack
}
//清空栈
func (myStack * StackX)Clear() {
myStack.myArray.Clear()//用数组的方法
myStack.myArray.TheSize = 0
}
//栈的大小
func (myStack * StackX)Size() int {
return myStack.myArray.TheSize
}
//出栈
func (myStack * StackX)Pop() interface{} {
if !myStack.IsEmpty() {
last := myStack.myArray.dataStore[myStack.myArray.TheSize - 1]//最后一个数据
myStack.myArray.Delete(myStack.myArray.TheSize - 1)//删除最后一个
return last
}
return nil
}
//入栈
func (myStack * StackX)Push(data interface{}) {
if !myStack.IsFull() {
myStack.myArray.Append(data)
}
}
//是否栈满了
func (myStack * StackX)IsFull()bool {
return myStack.myArray.TheSize >= 10
}
//是否空栈
func (myStack * StackX)IsEmpty()bool {
if myStack.myArray.TheSize == 0 {
return true
} else {
return false
}
}
- 使用
package main
import (
"godemo01/ArrayList"
"fmt"
)
func main() {
myStack := ArrayList.NewArrayListStackX()
myStack.Push(1)
myStack.Push(2)
myStack.Push(3)
myStack.Push(4)
// 使用迭代器
for it:= myStack.Myit; it.HasNext(); {
item,_ := it.Next()
fmt.Println(item)
}
fmt.Println(myStack.Size())// 4
// myStack.Clear()
fmt.Println(myStack.IsFull())// false
fmt.Println(myStack.IsEmpty())// false
fmt.Println(myStack.Pop())// 4
fmt.Println(myStack.Pop())// 3
fmt.Println(myStack.Pop())// 2
fmt.Println(myStack.Pop())// 1
fmt.Println(myStack.IsFull())//false
fmt.Println(myStack.IsEmpty())// true
fmt.Println(myStack.Size())
}