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