A little datastructures
							parent
							
								
									2150188501
								
							
						
					
					
						commit
						c4e7f0d5ea
					
				| @ -0,0 +1,7 @@ | ||||
| # Basic Data Structures | ||||
| 
 | ||||
| These are basic implementations of standard data structures. They are not thread safe implementations. To avoid race conditions you would need to use a mutex (mutual exclusion lock) to lock the data structure before any reads or writes. The `sync` package has a `RWMutex` that can be used. | ||||
| 
 | ||||
| 
 | ||||
| ## Example of using Mutex | ||||
| 
 | ||||
| @ -0,0 +1,41 @@ | ||||
| package datastructures | ||||
| 
 | ||||
| import "errors" | ||||
| 
 | ||||
| // Queue a First in First out data structure.
 | ||||
| type Queue struct { | ||||
| 	elements []any | ||||
| } | ||||
| 
 | ||||
| // Enqueue adds and element to the queue
 | ||||
| func (q *Queue) Enqueue(el any) { | ||||
| 	q.elements = append(q.elements, el) | ||||
| } | ||||
| 
 | ||||
| // Dequeue removes an element from the queue
 | ||||
| func (q *Queue) Dequeue() (any, error) { | ||||
| 	if q.IsEmpty() { | ||||
| 		return nil, errors.New("empty queue") | ||||
| 	} | ||||
| 	el := q.elements[0] | ||||
| 	q.elements = q.elements[1:] | ||||
| 	return el, nil | ||||
| } | ||||
| 
 | ||||
| // Peek retrieves a copy of the next element in the queue.
 | ||||
| func (q *Queue) Peek() (any, error) { | ||||
| 	if q.IsEmpty() { | ||||
| 		return nil, errors.New("empty queue") | ||||
| 	} | ||||
| 	return q.elements[0], nil | ||||
| } | ||||
| 
 | ||||
| // IsEmpty checks if the queue has any elements
 | ||||
| func (q *Queue) IsEmpty() bool { | ||||
| 	return q.Size() == 0 | ||||
| } | ||||
| 
 | ||||
| // Size checks the size of the queue
 | ||||
| func (q *Queue) Size() int { | ||||
| 	return len(q.elements) | ||||
| } | ||||
| @ -0,0 +1,91 @@ | ||||
| package datastructures | ||||
| 
 | ||||
| type Set struct { | ||||
| 	elements map[any]bool | ||||
| } | ||||
| 
 | ||||
| func (s *Set) Add(el any) { | ||||
| 	s.elements[el] = true | ||||
| } | ||||
| 
 | ||||
| func (s *Set) Remove(el any) { | ||||
| 	delete(s.elements, el) | ||||
| } | ||||
| 
 | ||||
| func (s *Set) IsEmpty() bool { | ||||
| 	return s.Size() == 0 | ||||
| } | ||||
| 
 | ||||
| func (s *Set) Size() int { | ||||
| 	return len(s.elements) | ||||
| } | ||||
| 
 | ||||
| func (s *Set) Has(el any) bool { | ||||
| 	_, ok := s.elements[el] | ||||
| 	return ok | ||||
| } | ||||
| 
 | ||||
| func (s *Set) Difference(set Set) Set { | ||||
| 	d := s.Copy() | ||||
| 	for k := range d.elements { | ||||
| 		if set.Has(k) { | ||||
| 			d.Remove(k) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return d | ||||
| } | ||||
| 
 | ||||
| func (s *Set) IsSubset(t Set) bool { | ||||
| 	for k := range s.elements { | ||||
| 		if !t.Has(k) { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
| 
 | ||||
| func (s *Set) List() []any { | ||||
| 	list := make([]any, s.Size()) | ||||
| 	for k := range s.elements { | ||||
| 		list = append(list, k) | ||||
| 	} | ||||
| 	return list | ||||
| } | ||||
| 
 | ||||
| func (s *Set) Copy() Set { | ||||
| 	c := NewSet() | ||||
| 	for k := range s.elements { | ||||
| 		c.Add(k) | ||||
| 	} | ||||
| 	return c | ||||
| } | ||||
| 
 | ||||
| // NewSet creates a new instance of Set
 | ||||
| func NewSet() Set { | ||||
| 	return Set{elements: make(map[any]bool)} | ||||
| } | ||||
| 
 | ||||
| // Union determines the OR relationship on all sets under consideration
 | ||||
| func Union(sets ...Set) Set { | ||||
| 	u := sets[0].Copy() | ||||
| 	for _, set := range sets[1:] { | ||||
| 		for k := range set.elements { | ||||
| 			u.Add(k) | ||||
| 		} | ||||
| 	} | ||||
| 	return u | ||||
| } | ||||
| 
 | ||||
| // Intersection determines the AND relationship of all sets under consideration
 | ||||
| func Intersection(sets ...Set) Set { | ||||
| 	i := sets[0].Copy() | ||||
| 	for k := range i.elements { | ||||
| 		for _, set := range sets[1:] { | ||||
| 			if !set.Has(k) { | ||||
| 				i.Remove(k) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return i | ||||
| } | ||||
| @ -0,0 +1,66 @@ | ||||
| package datastructures | ||||
| 
 | ||||
| import "errors" | ||||
| 
 | ||||
| // Stack a Last in First out data structure.
 | ||||
| type Stack struct { | ||||
| 	elements []any | ||||
| } | ||||
| 
 | ||||
| // Push add an element to the top of the stack
 | ||||
| //
 | ||||
| // Parameters:
 | ||||
| //
 | ||||
| //	any: an element to add to the top of the stack.
 | ||||
| func (s *Stack) Push(el any) { | ||||
| 	s.elements = append(s.elements, el) | ||||
| } | ||||
| 
 | ||||
| // Pop removes and returns the top element of the stack.
 | ||||
| //
 | ||||
| // Returns:
 | ||||
| //
 | ||||
| //	any: The top element of the stack
 | ||||
| //
 | ||||
| //	error: If the stack is found to be empty
 | ||||
| func (s *Stack) Pop() (any, error) { | ||||
| 	if s.IsEmpty() { | ||||
| 		return nil, errors.New("empty stack") | ||||
| 	} | ||||
| 	el := s.elements[len(s.elements)-1] | ||||
| 	s.elements = s.elements[:len(s.elements)-1] | ||||
| 	return el, nil | ||||
| } | ||||
| 
 | ||||
| // Peek checks the top item in the stack.
 | ||||
| //
 | ||||
| // Returns:
 | ||||
| //
 | ||||
| //	any: a copy of the top element
 | ||||
| //
 | ||||
| //	error: An error if the stack is empty
 | ||||
| func (s *Stack) Peek() (any, error) { | ||||
| 	if s.IsEmpty() { | ||||
| 		return nil, errors.New("empty stack") | ||||
| 	} | ||||
| 
 | ||||
| 	return s.elements[len(s.elements)-1], nil | ||||
| } | ||||
| 
 | ||||
| // IsEmpty checks if the stack contains any elements.
 | ||||
| //
 | ||||
| // Returns:
 | ||||
| //
 | ||||
| //	bool: True is the stack is empty. False if the stack contains elements.
 | ||||
| func (s *Stack) IsEmpty() bool { | ||||
| 	return s.Size() == 0 | ||||
| } | ||||
| 
 | ||||
| // Size checks this size of the stack
 | ||||
| //
 | ||||
| // Returns:
 | ||||
| //
 | ||||
| //	int: The number of elements on the stack
 | ||||
| func (s *Stack) Size() int { | ||||
| 	return len(s.elements) | ||||
| } | ||||
					Loading…
					
					
				
		Reference in New Issue