package utils type Queue[T any] struct { data []T len int } // New creates an empty stack func NewQueue[T any]() Queue[T] { q := Queue[T]{ []T{}, 0, } return q } // Push pushes the value v on top of stack s. func (q *Queue[T]) Enqueue(v T) { q.data = append(q.data, v) q.len++ } func (q *Queue[T]) Dequeue() T { if !q.HasElement() { panic("called Dequeue() on an empty queue") } value := q.data[0] var zeroValue T q.data[0] = zeroValue q.data = q.data[1:] q.len-- return value } func (q *Queue[T]) HasElement() bool { return q.len > 0 } func (q *Queue[T]) GetData() []T { return q.data }