文章目录
1. 基于切片的实现
package main
import (
"fmt"
)
var stackArray []interface{} //创建一个接口类型的切片 可以保存任何类型的元素
var a []int
func push(x interface{}) {
stackArray = append(stackArray, x) //加入x
}
func pop() interface{} {
sz := len(stackArray) //获取栈大小
ele := stackArray[sz-1] //最后1个元素是栈顶元素 [0-n-1]--[栈底-栈顶]
stackArray = stackArray[:sz-1] //删除最后一个元素(栈顶元素)
return ele
}
func peek() interface{} {
return stackArray[length()-1] //返回栈顶元素
}
func length() int {
return len(stackArray)
}
func isEmpty() bool {
return length() == 0
}
func main() {
push(1)
push(2)
push(3)
fmt.Println(stackArray)
fmt.Println(pop())
fmt.Println(peek())
push("hello")
push(3.14)
fmt.Println(peek())
fmt.Println(pop())
fmt.Println(peek())
}
2. 基于链表的实现
package main
import (
"fmt"
)
type Node struct {
Val interface{}
Next *Node
}
type Stack struct {
top *Node
sz int
}
func (st *Stack) push(x interface{}) {
newNode := &Node{} //创建一个新节点
newNode.Val = x
newNode.Next = st.top
st.top = newNode //栈顶指针指向新节点
st.sz++
}
func (st *Stack) pop() interface{} {
ele := st.top.Val
st.top = st.top.Next
st.sz--
return ele
}
func (st *Stack) peek() interface{} {
ele := st.top.Val
return ele
}
func (st *Stack) size() int {
return st.sz
}
func (st *Stack) isEmpty() bool {
return st.size() == 0
}
func (st *Stack) show() {
for cur := st.top; cur != nil; cur = cur.Next {
fmt.Print(cur.Val)
if cur.Next != nil {
fmt.Print("<-")
}
}
fmt.Println()
}
func main() {
st := &Stack{}
st.push("aaa")
st.push("bbb")
st.push("ccc") // "ccc"->"bbb"->"aaa" "ccc"是栈顶元素 相当于push时是链表的头插法
st.show()
fmt.Println(st.size())
fmt.Println(st.pop())
fmt.Println(st.pop())
fmt.Println(st.size())
fmt.Println(st.pop())
fmt.Println(st.isEmpty())
}
/*ccc<-bbb<-aaa
3
ccc
bbb
1
aaa
true
*/