new file: linear/queue.go
This commit is contained in:
@@ -0,0 +1,71 @@
|
|||||||
|
package linear
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Queue []Type{} -> creates a Queue with no fixed size
|
||||||
|
// Implemented as slice
|
||||||
|
type Queue[T any] struct {
|
||||||
|
capacity uint8
|
||||||
|
container []T
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueueFixed -> QueueFixed[Type](size) creates a Queue with no fixed size
|
||||||
|
func QueueFixed[T any](value uint8) *Queue[T] {
|
||||||
|
return &Queue[T]{
|
||||||
|
capacity: value,
|
||||||
|
container: make([]T, 0, value),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add() -> enqeues an item, returns err if queue if full
|
||||||
|
func (q *Queue[T]) Add(item T) error {
|
||||||
|
if q.capacity > 0 && q.capacity <= uint8(len(q.container)) {
|
||||||
|
return errors.New("Queue full")
|
||||||
|
}
|
||||||
|
|
||||||
|
q.container = append(q.container, item)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Peek() -> returns the upcoming item
|
||||||
|
func (q *Queue[T]) Peek() (T, bool) {
|
||||||
|
if len(q.container) <= 0 {
|
||||||
|
var zero T
|
||||||
|
return zero, false
|
||||||
|
}
|
||||||
|
|
||||||
|
return q.container[0], true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pull() -> returns the upcoming item and removes it from Queue
|
||||||
|
func (q *Queue[T]) Pull() (T, error) {
|
||||||
|
if len(q.container) <= 0 {
|
||||||
|
var zero T
|
||||||
|
return zero, errors.New("Queue is empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
upcoming := q.container[0]
|
||||||
|
q.container = q.container[1:]
|
||||||
|
|
||||||
|
return upcoming, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cull() -> removes the last item , returns it and err
|
||||||
|
func (q *Queue[T]) Cull() (T, error) {
|
||||||
|
if len(q.container) <= 0 {
|
||||||
|
var zero T
|
||||||
|
return zero, errors.New("Queue is empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
last := q.container[len(q.container)-1]
|
||||||
|
q.container = q.container[0 : len(q.container)-1]
|
||||||
|
|
||||||
|
return last, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Size() -> returns size of queue
|
||||||
|
func (q *Queue[T]) Size() int {
|
||||||
|
return len(q.container)
|
||||||
|
}
|
||||||
+1
-4
@@ -1,4 +1,4 @@
|
|||||||
package stack
|
package linear
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
@@ -12,12 +12,10 @@ type Stack[T any] struct {
|
|||||||
|
|
||||||
// StackFixed -> creates Stack with a fixed size
|
// StackFixed -> creates Stack with a fixed size
|
||||||
func StackFixed[T any](value int) *Stack[T] {
|
func StackFixed[T any](value int) *Stack[T] {
|
||||||
|
|
||||||
return &Stack[T]{
|
return &Stack[T]{
|
||||||
Capacity: value,
|
Capacity: value,
|
||||||
Container: make([]T, 0, value),
|
Container: make([]T, 0, value),
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Push -> Appends value to stack returns error
|
// Push -> Appends value to stack returns error
|
||||||
@@ -33,7 +31,6 @@ func (s *Stack[T]) Push(value T) error {
|
|||||||
|
|
||||||
// Pop -> returns value,error and removes last index
|
// Pop -> returns value,error and removes last index
|
||||||
func (s *Stack[T]) Pop() (T, error) {
|
func (s *Stack[T]) Pop() (T, error) {
|
||||||
|
|
||||||
var zero T
|
var zero T
|
||||||
|
|
||||||
if len(s.Container) <= 0 {
|
if len(s.Container) <= 0 {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package stack
|
package linear
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
@@ -13,5 +13,4 @@ func TestPush(t *testing.T) {
|
|||||||
if len(s.Container) != 3 {
|
if len(s.Container) != 3 {
|
||||||
t.Errorf("expected 2 items, got %d", len(s.Container))
|
t.Errorf("expected 2 items, got %d", len(s.Container))
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user