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]
Crie sua conta no Exercism para aprender e dominar Dart com 78 exercícios e mentoria humana de verdade, tudo de graça.
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.