栈,后进先出(先进后出),常用数据结构之一。有两种实现形式:顺序存储和链式存储。
深度优先遍历可以基于该数据结构做模拟操作。
刷题常用。
实现一,基于go标准库的container/list
import "container/list"
type Stack struct {
l *list.List
}
func NewStack() *Stack {
return &Stack{
l: list.New(),
}
}
func (o *Stack) Push(v interface{}) {
o.l.PushBack(v)
}
func (o *Stack) Peek() interface{} {
if o.IsEmpty() {
panic("Stack is empty")
}
return o.l.Back().Value
}
func (o *Stack) Pop() {
if o.IsEmpty() {
panic("Stack is empty")
}
o.l.Remove(o.l.Back())
}
func (o *Stack) IsEmpty() bool {
return o.l.Len() == 0
}
func (o *Stack) Len() int {
return o.l.Len()
}
实现二,基于slice
type Stack struct {
data []interface{}
}
func NewStack() *Stack {
return &Stack{}
}
func (o *Stack) Push(v interface{}) {
o.data = append(o.data, v)
}
func (o *Stack) Peek() interface{} {
if o.IsEmpty() {
panic("Stack is empty")
}
return o.data[len(o.data)-1]
}
func (o *Stack) Pop() {
if o.IsEmpty() {
panic("Stack is empty")
}
o.data = o.data[:len(o.data)-1]
}
func (o *Stack) Len() int {
return len(o.data)
}
func (o *Stack) IsEmpty() bool {
return len(o.data) == 0
}
实现三,基于单链表
// 单链表的package
import "algo/internal/singlylinkedlist"
type Stack struct {
list *singlylinkedlist.SinglyLinkedList
size int
}
func NewStack() *Stack {
return &Stack{
list: &singlylinkedlist.SinglyLinkedList{},
}
}
func (o *Stack) Len() int {
return o.size
}
func (o *Stack) IsEmpty() bool {
return o.size == 0
}
func (o *Stack) Push(v interface{}) {
o.list.AddToHead(v)
o.size++
}
func (o *Stack) Peek() interface{} {
if o.IsEmpty() {
panic("Stack is empty")
}
return o.list.Head().V
}
func (o *Stack) Pop() {
if o.IsEmpty() {
panic("Stack is empty")
}
o.list.RemoveHead()
o.size--
}
测试代码:
package main
import "fmt"
func main() {
sk := NewStack()
for i := 0; i < 9; i++ {
sk.Push(i * 2)
}
for !sk.IsEmpty() {
fmt.Println(sk.Peek().(int), sk.Len())
sk.Pop()
}
}