Trilhas
/
Python
Python
/
Exercícios
/
Buffer circular
Buffer circular

Buffer circular

Fácil

Instruções

Um buffer circular, buffer cíclico ou buffer em anel é uma estrutura de dados que usa um único buffer de tamanho fixo como se estivesse conectado de ponta a ponta.

Um buffer circular começa vazio e com um comprimento predefinido. Por exemplo, este é um buffer de 7 elementos:

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

Suponha que um 1 seja escrito no meio do buffer (a posição inicial exata não importa em um buffer circular):

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

Depois, suponha que mais dois elementos sejam adicionados, 2 e 3, e que eles sejam anexados depois do 1:

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

Se dois elementos forem removidos do buffer, os valores mais antigos dentro dele são removidos. Os dois elementos removidos, neste caso, são 1 e 2, deixando o buffer apenas com um 3:

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

Se o buffer tiver 7 elementos, então ele está completamente cheio:

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

Quando o buffer está cheio, um erro é gerado, avisando o cliente de que novas escritas ficam bloqueadas até que uma vaga fique livre.

Quando o buffer está cheio, o cliente pode optar por sobrescrever os dados mais antigos com uma escrita forçada. Neste caso, mais dois elementos, A e B, são adicionados e sobrescrevem os valores 3 e 4:

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

Os valores 3 e 4 foram substituídos por A e B, fazendo com que o 5 seja agora o dado mais antigo do buffer. Por fim, se dois elementos forem removidos, o que seria retornado são 5 e 6, resultando no buffer:

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

Como há espaço disponível, se o cliente usar a sobrescrita novamente para armazenar C e D, o espaço onde 5 e 6 estavam armazenados será usado, e não o local de 7 e 8. O 7 ainda é o elemento mais antigo e o buffer está cheio novamente.

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

Personalizando e lançando exceções

Às vezes é necessário tanto personalizar quanto usar raise em exceções no seu código. Quando você faz isso, deve sempre incluir uma mensagem de erro significativa para indicar qual é a origem do erro. Isso deixa seu código mais legível e ajuda muito no debug.

Exceções personalizadas podem ser criadas por meio de novas classes de exceção (consulte classes para mais detalhes) que normalmente são subclasses de Exception.

Em situações em que você sabe que a origem do erro será uma derivada de um certo tipo de exceção, você pode escolher herdar de um dos built in error types sob a classe Exception. Ao lançar o erro, você ainda deve incluir uma mensagem significativa.

Este exercício em particular exige que você crie duas exceções personalizadas. Uma exceção a ser lançada/"disparada" quando seu buffer circular estiver cheio, e outra para quando ele estiver vazio. Os testes só passarão se você personalizar as exceções adequadas, lançá-las com raise e incluir mensagens de erro adequadas.

Para personalizar uma built-in exception, crie uma class que herde dessa exceção. Ao lançar a exceção personalizada com uma mensagem, escreva a mensagem como argumento para o 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")

Fonte

WikipediaO link abre em uma nova janela ou aba
Editar via GitHub O link abre em uma nova janela ou aba
Python Exercism

Tudo pronto para começar Buffer circular?

Crie sua conta no Exercism para aprender e dominar Python com 17 conceitos146 exercícios e mentoria humana de verdade, tudo de graça.

Mergulho profundo em Buffer circular!

Neste vídeo, damos uma olhada no buffer circular: o que ele é, onde é usado e diferentes implementações, incluindo filas, arrays estáticos e dinâmicos, estruturas de dados imutáveis e uma divertida implementação baseada em agentes.