stack.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package containers
  2. import "fmt"
  3. // NewStack is constructor for stack
  4. func NewStack(length int) *Stack {
  5. return &Stack{make([]interface{}, 0, length)}
  6. }
  7. // Sack struct
  8. type Stack struct {
  9. list []interface{}
  10. }
  11. // Peek returns object on top
  12. func (s *Stack) Peek() interface{} {
  13. if len(s.list) > 0 {
  14. return s.list[len(s.list)-1]
  15. }
  16. return nil
  17. }
  18. // Push setup object in top
  19. func (s *Stack) Push(vals ...interface{}) {
  20. s.list = append(s.list, vals...)
  21. }
  22. // Pop get and return object on top
  23. func (s *Stack) Pop() (res interface{}) {
  24. if len(s.list) > 0 {
  25. index := len(s.list) - 1
  26. res = s.list[index]
  27. s.list = s.list[:index]
  28. }
  29. return
  30. }
  31. // Len returns stack size
  32. func (s *Stack) Len() int {
  33. return len(s.list)
  34. }
  35. // Cap returns stack capacity
  36. func (s *Stack) Cap() int {
  37. return cap(s.list)
  38. }
  39. // String returns description string
  40. func (s *Stack) String() string {
  41. res := fmt.Sprintf("Stack (len %v, cap %v)\n=====\n", len(s.list), cap(s.list))
  42. for i := len(s.list) - 1; i >= 0; i-- {
  43. res += fmt.Sprintf("%v: %v\n", i, s.list[i])
  44. }
  45. res += "=====\n"
  46. return res
  47. }
  48. // PopAll get all elements and returns slice with elements
  49. func (s *Stack) PopAll() []interface{} {
  50. res := make([]interface{}, len(s.list))
  51. copy(res, s.list)
  52. s.list = s.list[:0]
  53. return res
  54. }
  55. // Забирает стек до индекса (если в стеке, например, 5 элементов, индекс = 2, из стека будет взято 3 элемента)
  56. func (s *Stack) PopAllIndex(index int) []interface{} {
  57. res := make([]interface{}, len(s.list)-index)
  58. copy(res, s.list[index:])
  59. s.list = s.list[:index]
  60. return res
  61. }
  62. // Разворачивает стек, забирает все элементы и возвращает их в срезе
  63. func (s *Stack) PopAllReverse() []interface{} {
  64. res := make([]interface{}, len(s.list))
  65. for i := 0; i < len(s.list); i++ {
  66. res[i] = s.list[len(s.list)-i-1]
  67. }
  68. s.list = s.list[:0]
  69. return res
  70. }
  71. // Забирает элементы из стека до индекса, разворачивает результат и возвращает его в срезе
  72. func (s *Stack) PopAllReverseIndex(index int) []interface{} {
  73. res := make([]interface{}, len(s.list)-index)
  74. for i := 0; i < len(s.list)-index; i++ {
  75. res[i] = s.list[len(s.list)-i-1]
  76. }
  77. s.list = s.list[:index]
  78. return res
  79. }