Sebastian Gomez
🚀 Estructuras de datos en Go: Dequeue 🚀
Las dequeues (🔄) o colas de doble extremo, son estructuras de datos versátiles que permiten insertar (➕) y eliminar (➖) elementos tanto por el frente (🔝) como por la parte trasera (🔚). En este post, exploraremos las principales características de esta estructura, su historia 📚 y algunos ejemplos de su uso en problemas de computación 💻.
Una dequeue (🔄) es un tipo de estructura de datos que permite insertar (➕) y eliminar (➖) elementos tanto por el frente (🔝) como por la parte trasera (🔚). Esto la hace similar a una cola (🔜) o una pila (🔝), pero con la flexibilidad adicional de poder agregar o quitar elementos en ambos extremos. Esto hace que sea útil en muchos algoritmos y situaciones donde se requiera una estructura de datos que permita operaciones de inserción (➕) y eliminación (➖) eficientes en ambos extremos.
El concepto de una dequeue (🔄) probablemente haya sido desarrollado poco después de la invención de la computadora (💻). Sin embargo, la documentación escrita más antigua que se conoce sobre la estructura de datos dequeue data de la década de 1950 y se refiere a ella como una "cola circular doble" (↪️).
A partir de ahí, la estructura de datos dequeue ha sido ampliamente utilizada en diferentes ámbitos de la informática, desde la programación de sistemas hasta la investigación en inteligencia artificial (🧠) y algoritmos (🔢).
Aquí hay un ejemplo de código en Go que implementa una "dequeue" o cola de doble extremo:
package main
import (
"fmt"
)
// Definimos una estructura de datos dequeue.
type Dequeue struct {
items []int
head int
tail int
count int
}
// Función para crear una nueva dequeue.
func NewDequeue() *Dequeue {
return &Dequeue{
items: make([]int, 0),
head: -1,
tail: -1,
count: 0,
}
}
// Función para insertar un elemento en el frente de la dequeue.
func (d *Dequeue) PushFront(item int) {
if d.head == -1 {
d.head = 0
d.tail = 0
d.items = append(d.items, item)
} else {
d.head--
if d.head < 0 {
d.head = len(d.items) - 1
}
d.items[d.head] = item
}
d.count++
}
// Función para insertar un elemento en la parte trasera de la dequeue.
func (d *Dequeue) PushBack(item int) {
if d.head == -1 {
d.head = 0
d.tail = 0
d.items = append(d.items, item)
} else {
d.tail++
if d.tail == len(d.items) {
d.tail = 0
}
d.items[d.tail] = item
}
d.count++
}
// Función para eliminar un elemento del frente de la dequeue.
func (d *Dequeue) PopFront() int {
if d.head == -1 {
return -1
}
item := d.items[d.head]
d.head++
if d.head == len(d.items) {
d.head = 0
}
d.count--
if
d.count == 0 {
d.head = -1
d.tail = -1
}
return item
}
// Función para eliminar un elemento de la parte trasera de la dequeue.
func (d *Dequeue) PopBack() int {
if d.head == -1 {
return -1
}
item := d.items[d.tail]
d.tail--
if d.tail < 0 {
d.tail = len(d.items) - 1
}
d.count--
if d.count == 0 {
d.head = -1
d.tail = -1
}
return item
}
func main() {
dequeue := NewDequeue()
// Insertar elementos en la frente y en la parte trasera de la dequeue.
dequeue.PushFront(1)
dequeue.PushBack(2)
dequeue.PushBack(3)
dequeue.PushFront(0)
// Imprimir elementos en la dequeue.
fmt.Println("Elementos en la dequeue:")
for i := 0; i < dequeue.count; i++ {
fmt.Println(dequeue.PopFront())
}
🔥 Ejemplos de uso de dequeues (🔄) 🔥
Las dequeues (🔄) son útiles en una variedad de problemas de computación 💻. Aquí hay algunos de los usos más comunes:
Estos son solo algunos ejemplos; la versatilidad de las dequeues (🔄) las hace aplicables a muchos otros problemas de computación 💻.
En resumen, una dequeue (🔄) es una estructura de datos útil y versátil que se puede utilizar en muchos problemas de computación. Esperamos que esta introducción te haya dado una idea de lo que son las dequeues (🔄) y cómo se pueden implementar en Go 🏁. Si tienes preguntas o comentarios adicionales, ¡no dudes en dejarlos a continuación! 💬
A continuación te dejo un par de ejercicios para que practiques la estructura Cola (Queue) en Go y envies la solucioón como un Pull requeste a este repositorio:
1. Implementa una función NewDeque() que crea una nueva deque vacía y devuelve un puntero a ella.
2. Implementa una función Size(d *Deque) int que devuelve el número de elementos en la deque d.
3. Implementa una función IsEmpty(d *Deque) bool que devuelve verdadero si la deque d está vacía, falso en caso contrario.
4. Implementa una función PushFront(d *Deque, value interface{}) que añade un elemento al frente de la deque d.
5. Implementa una función PushBack(d *Deque, value interface{}) que añade un elemento al final de la deque d.
6. Implementa una función PopFront(d *Deque) (interface{}, error) que elimina y devuelve el elemento del frente de la deque d. Si la deque está vacía, devuelve un error.
7. Implementa una función PopBack(d *Deque) (interface{}, error) que elimina y devuelve el elemento del final de la deque d. Si la deque está vacía, devuelve un error.
8. Implementa una función Front(d *Deque) (interface{}, error) que devuelve el elemento del frente de la deque d sin eliminarlo. Si la deque está vacía, devuelve un error.
9. Implementa una función Back(d *Deque) (interface{}, error) que devuelve el elemento del final de la deque d sin eliminarlo. Si la deque está vacía, devuelve un error.
10. Escribe un programa que utilice todas las funciones implementadas en los ejercicios anteriores para realizar diversas operaciones con deques, como añadir y eliminar elementos, comprobar si está vacía y obtener el tamaño.
A continuación, te dejo un par de ejercicios para que practiques la estructura Deque (🔄) en Go y envíes la solución como un Pull request a este repositorio: Go Para Principiantes 🎓.
Creador de contenido principalmente acerca de tecnología.