Trilhas
/
8th
8th
/
Exercícios
/
Buffer circular
Buffer circular

Buffer circular

Médio

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]

Este exercício apresenta alguns conceitos que você talvez ainda não tenha visto:

Namespace definido pelo usuário

Todas as palavras em 8th pertencem a um namespace, por exemplo, a:new se refere à palavra new no namespace a. Também é possível definir namespaces personalizados, que é o que fazemos no topo do arquivo circular-buffer.8th:

ns: cb

Isso significa que todas as palavras dentro desse arquivo podem ser acessadas via cb:<word>, o que é uma ótima forma de agrupar funcionalidades relacionadas.

Para mais informações, confira a documentação de namespaces.

Exceções

Espera-se que as palavras read e write lancem uma exceção quando forem chamadas em um buffer circular com um estado inválido. Para mais informações, confira a documentação de exceções e tratamento de erros.

Objetos

Embora você seja livre para implementar o buffer circular como quiser, você pode considerar usar o suporte a objetos do 8th.


Fonte

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

Tudo pronto para começar Buffer circular?

Crie sua conta no Exercism para aprender e dominar 8th com 70 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.