Rutas
/
Python
Python
/
Ejercicios
/
Búfer circular
Búfer circular

Búfer circular

Fácil

Instrucciones

Un búfer circular, búfer cíclico o búfer en anillo es una estructura de datos que usa un único búfer de tamaño fijo como si estuviera conectado de extremo a extremo.

Un búfer circular empieza vacío y con una longitud predefinida. Por ejemplo, este es un búfer de 7 elementos:

[ ][ ][ ][ ][ ][ ][ ]

Supón que se escribe un 1 en el centro del búfer (la ubicación inicial exacta no importa en un búfer circular):

[ ][ ][ ][1][ ][ ][ ]

Después, supón que se añaden dos elementos más, 2 y 3, que quedan a continuación del 1:

[ ][ ][ ][1][2][3][ ]

Si luego se eliminan dos elementos del búfer, se eliminan los valores más antiguos que contiene. Los dos elementos eliminados, en este caso, son el 1 y el 2, con lo que el búfer se queda solo con un 3:

[ ][ ][ ][ ][ ][3][ ]

Si el búfer tiene 7 elementos, entonces está completamente lleno:

[5][6][7][8][9][3][4]

Cuando el búfer está lleno se producirá un error, que avisará al cliente de que las escrituras posteriores están bloqueadas hasta que se libere una posición.

Cuando el búfer está lleno, el cliente puede optar por sobrescribir los datos más antiguos con una escritura forzada. En este caso, se añaden dos elementos más, A y B, que sobrescriben el 3 y el 4:

[5][6][7][8][9][A][B]

El 3 y el 4 han sido reemplazados por A y B, con lo que el 5 pasa a ser ahora el dato más antiguo del búfer. Por último, si se eliminan dos elementos, lo que se devolvería es el 5 y el 6, lo que da como resultado el búfer:

[ ][ ][7][8][9][A][B]

Como hay espacio disponible, si el cliente vuelve a usar la sobrescritura para guardar C y D, se usará el espacio donde antes se guardaron el 5 y el 6, no la ubicación del 7 y el 8. El 7 sigue siendo el elemento más antiguo y el búfer vuelve a estar lleno.

[C][D][7][8][9][A][B]

Personalizar y lanzar excepciones

A veces es necesario tanto personalizar las excepciones de tu código como usar raise para lanzarlas. Cuando lo hagas, incluye siempre un mensaje de error significativo que indique cuál es el origen del error. Esto hace que tu código sea más legible y ayuda mucho a la hora de depurar.

Las excepciones personalizadas se pueden crear con nuevas clases de excepción (consulta classes para más detalles), que normalmente son subclases de Exception.

En los casos en los que sepas que el origen del error será una derivación de un determinado tipo de excepción, puedes optar por heredar de uno de los built in error types que hay bajo la clase Exception. Cuando lances el error, debes incluir igualmente un mensaje significativo.

Este ejercicio en concreto requiere que crees dos excepciones personalizadas. Una excepción que se lance/«arroje» cuando tu búfer circular esté lleno y otra para cuando esté vacío. Los tests solo pasarán si personalizas las excepciones adecuadas, usas raise para lanzarlas e incluyes los mensajes de error adecuados.

Para personalizar una built-in exception, crea una class que herede de esa excepción. Al lanzar la excepción personalizada con un mensaje, escribe el mensaje como argumento del tipo exception:

# subclassing the built-in BufferError to create BufferFullException
class BufferFullException(BufferError):
    """Exception raised when CircularBuffer is full.

    message: explanation of the error.

    """
    def __init__(self, message):
        self.message = message

        
# raising a BufferFullException
raise BufferFullException("Circular buffer is full")

Fuente

WikipediaEl enlace se abre en una nueva ventana o pestaña
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Python Exercism

¿Listo para empezar Búfer circular?

Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.

¡Análisis en profundidad de Búfer circular!

En este vídeo echamos un vistazo al búfer circular: qué es, dónde se usa y distintas implementaciones, incluidas colas, arrays estáticos y dinámicos, estructuras de datos inmutables y una divertida implementación basada en agentes.