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 ligado de ponta a ponta.
Um buffer circular começa vazio e com um determinado comprimento predefinido. Por exemplo, este é um buffer de 7 elementos:
[ ][ ][ ][ ][ ][ ][ ]
Imagina que se escreve um 1 no meio do buffer (a localização inicial exata não importa num buffer circular):
[ ][ ][ ][1][ ][ ][ ]
Imagina agora que são acrescentados mais dois elementos, o 2 e o 3, que ficam depois do 1:
[ ][ ][ ][1][2][3][ ]
Se depois forem removidos dois elementos do buffer, são removidos os valores mais antigos que estão dentro dele. Os dois elementos removidos, neste caso, são o 1 e o 2, ficando o buffer apenas com o 3:
[ ][ ][ ][ ][ ][3][ ]
Se o buffer tiver 7 elementos, fica completamente cheio:
[5][6][7][8][9][3][4]
Quando o buffer está cheio, é gerado um erro que avisa o cliente de que novas escritas ficam bloqueadas até que fique uma fenda livre.
Quando o buffer está cheio, o cliente pode optar por sobrescrever os dados mais antigos com uma escrita forçada. Neste caso, são acrescentados mais dois elementos, o A e o B, que sobrescrevem o 3 e o 4:
[5][6][7][8][9][A][B]
O 3 e o 4 foram substituídos por A e B, o que faz do 5 o dado mais antigo do buffer. Por fim, se forem removidos dois elementos, o que seria devolvido é o 5 e o 6, dando origem ao buffer:
[ ][ ][7][8][9][A][B]
Como há espaço disponível, se o cliente voltar a usar a sobrescrita para guardar C e D, será usado o espaço onde o 5 e o 6 estavam guardados anteriormente, e não a posição do 7 e do 8. O 7 continua a ser o elemento mais antigo e o buffer volta a estar cheio.
[C][D][7][8][9][A][B]
Inscreve-te no Exercism para aprenderes e dominares JavaScript com 37 conceitos159 exercícios, e mentoria humana real, tudo grátis.
Neste vídeo, vamos ver o Buffer Circular: o que é, 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.