github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/algorithm/datastructures/stack/array_stack.go (about) 1 package stack 2 3 import ( 4 "fmt" 5 "strings" 6 ) 7 8 // 数组栈 9 type ArrayStack struct { 10 top int 11 data []interface{} 12 } 13 14 func NewArrayStack() *ArrayStack { 15 return &ArrayStack{0, make([]interface{}, 0, 8)} 16 } 17 18 func (s *ArrayStack) Len() int { 19 return s.top 20 } 21 22 func (s *ArrayStack) IsEmpty() bool { 23 return s.Len() == 0 24 } 25 26 func (s *ArrayStack) Peek() interface{} { 27 if s.IsEmpty() { 28 return nil 29 } 30 return s.data[s.top-1] 31 } 32 33 func (s *ArrayStack) Pop() interface{} { 34 if s.IsEmpty() { 35 return nil 36 } 37 ret := s.data[s.top-1] 38 s.data[s.top-1] = nil 39 s.top-- 40 return ret 41 } 42 43 func (s *ArrayStack) ToSlice() []interface{} { 44 ret := make([]interface{}, s.top) 45 j := 0 46 for i := s.top - 1; i >= 0; i-- { 47 ret[j] = s.data[i] 48 j++ 49 } 50 return ret 51 } 52 func (s *ArrayStack) Push(value interface{}) { 53 if s.top >= len(s.data) { 54 s.data = append(s.data, value) 55 } else { 56 s.data[s.top] = value 57 } 58 s.top++ 59 } 60 func (s *ArrayStack) Flush() { 61 s.top = 0 62 for i := range s.data { 63 s.data[i] = nil 64 } 65 } 66 func (s *ArrayStack) String() string { 67 sb := new(strings.Builder) 68 sb.WriteString("top ") 69 for i := s.top - 1; i >= 0; i-- { 70 sb.WriteString(fmt.Sprintf("%v ", s.data[i])) 71 } 72 return sb.String() 73 }