Queue
Una cola (queue en inglés) es una estructura de datos que sigue el principio de FIFO (First In First Out), es decir, el primer elemento en entrar es el primero en salir.
Implementación
package main
import "fmt"
type Queueable interface {
Enqueue(val int)
Dequeue() (int, error)
IsEmpty() bool
Size() int
}
var _ Queueable = &Queue{}
type Queue struct {
values []int
}
// Size implements Queueable.
func (q Queue) Size() int {
return len(q.values)
}
// IsEmpty determines if the Queue is empty.
func (q Queue) IsEmpty() bool {
return len(q.values) == 0
}
// Dequeue attempts to remove an element from the Queue
// If the Queue in empty, it returns an error.
func (q *Queue) Dequeue() (int, error) {
if q.IsEmpty() {
return 0, fmt.Errorf("attempt to remove an element from an empty Queue")
}
val := q.values[0]
q.values = q.values[1:]
return val, nil
}
// Enqueue adds a new value to the Queue.
func (q *Queue) Enqueue(val int) {
q.values = append(q.values, val)
}
// New creates a new Queue with the given list.
func New(list ...int) Queue {
return Queue{
values: make([]int, len(list)),
}
}
func main() {
q := New()
fmt.Println(q.IsEmpty(), q.Size())
q.Enqueue(1)
q.Enqueue(2)
// q.Enqueue(3)
fmt.Println(q.IsEmpty(), q.Size())
val, err := q.Dequeue()
if err != nil {
fmt.Println(err)
}
fmt.Println(q.IsEmpty(), q.Size(), val)
val, err = q.Dequeue()
if err != nil {
fmt.Println(err)
}
fmt.Println(q.IsEmpty(), q.Size(), val)
val, err = q.Dequeue()
if err != nil {
fmt.Println(err)
}
fmt.Println(q.IsEmpty(), q.Size(), val)
}