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  }