Skip to content

Instantly share code, notes, and snippets.

@eduardonunesp
Last active July 26, 2021 16:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eduardonunesp/1d6f337964f8f095085b78112cb32892 to your computer and use it in GitHub Desktop.
Save eduardonunesp/1d6f337964f8f095085b78112cb32892 to your computer and use it in GitHub Desktop.
Simple Stack
package utils
import "sync"
type Stack struct {
mutex sync.RWMutex
data []interface{}
}
func NewStack() Stack {
return Stack{}
}
func NewStackWithValue(data interface{}) Stack {
return Stack{
data: []interface{}{data},
}
}
func (s *Stack) Size() int {
s.mutex.RLock()
defer s.mutex.RUnlock()
return len(s.data)
}
func (s *Stack) Empty() bool {
s.mutex.RLock()
defer s.mutex.RUnlock()
return len(s.data) == 0
}
func (s *Stack) Push(value interface{}) {
s.mutex.Lock()
defer s.mutex.Unlock()
s.data = append(s.data, value)
}
func (s *Stack) Pop() interface{} {
s.mutex.Lock()
defer s.mutex.Unlock()
var ret interface{}
if len(s.data) > 0 {
n := len(s.data) - 1
ret = s.data[n]
s.data = s.data[:n]
}
return ret
}
func (s *Stack) Shift() interface{} {
s.mutex.Lock()
defer s.mutex.Unlock()
var ret interface{}
if len(s.data) > 0 {
n := 0
ret = s.data[n]
s.data[n] = nil
s.data = s.data[:n]
}
return ret
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment