16-数据结构之栈(基础)

36 阅读2分钟

栈(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())	
}