Buffer circular ou fila circular é a versão avançada da fila normal onde o último índice e o índice final são conectados em uma estrutura circular. O buffer circular em C++ segue dois métodos: enqueue() e dequeue(). Realizamos a operação de buffer circular ou fila circular com base nesses métodos.
- O método enqueue() verifica se o buffer está preenchido. Caso contrário, verifique se o índice final é o último. Nesse caso, defina o valor final como 0. Caso contrário, aumente o valor final pelo valor desse índice.
- A função dequeue() obtém o valor do índice frontal na fila circular. Se a fila estiver vazia, uma mensagem exibirá essa fila vazia. Caso contrário, obtém o último valor e exclui-o da fila.
Programa para implementar um buffer circular em C++
Seguindo os dois métodos mencionados, implementamos o buffer circular em C++. Vamos considerar todas as etapas para a implementação da fila circular em C++.
#incluir
usando namespace std;
estrutura MyQueue
{
interno cabeça , cauda ;
int Qtamanho;
interno * NovoArr;
MinhaFila ( não ) {
cabeça = cauda = -1 ;
Qtamanho = tamanho;
NovoArr = novo int [ é ] ;
}
vazio enQueue ( valor interno ) ;
int deQueue ( ) ;
void showQueue ( ) ;
} ;
Começando com o código, primeiro criamos a estrutura “MyQueue” para inicializar as variáveis head e tail. A variável head representa os índices frontais e a cauda representa os índices traseiros traseiros de uma matriz. Depois disso, é definido o tamanho da fila circular, denotado pela variável “Qsize”.
Em seguida, definimos o array alocado dinamicamente de “NewArr” que armazena os valores da fila circular. A seguir, chamamos MyQueue() que é um construtor e passamos o parâmetro “sz” para o tamanho da fila circular. Dentro do construtor MyQueue(), atribuímos o valor “-1” aos ponteiros inicial e final. Este valor negativo indica que a fila está vazia agora. Seguindo em frente, atribuímos o valor “sz” que representa o tamanho da fila circular. A fila circular “NewArr” é definida com uma nova palavra-chave para criar a matriz de inteiros dentro do tamanho “sz” especificado.
Em seguida, definimos as funções enQueue() e dequeue(). O enqueue() insere os valores na fila circular definida a partir do final. No entanto, os elementos no cabeçalho da fila circular são eliminados pela função dequeue(). A função membro showQueue() exibe os valores da fila circular.
Etapa 1: crie uma função para inserir os elementos em um buffer circular
Na etapa anterior, definimos uma classe onde os membros privados são inicializados e as funções dos membros privados são configuradas para implementar a fila circular. Agora, configuramos a função para criar a fila circular e inserir os valores dentro da fila circular usando o algoritmo.
void MyQueue::enQueue ( valor interno ){
se ( ( cabeça == 0 && cauda == Qtamanho - 1 ) || ( cauda == ( cabeça - 1 ) % ( Tamanho Q - 1 ) ) )
{
corte << ' \n A fila está preenchida' ;
retornar ;
}
outro se ( cabeça == - 1 )
{
cabeça = cauda = 0 ;
Novo Arr [ cauda ] = val;
}
outro se ( cauda == Qtamanho - 1 && cabeça ! = 0 )
{
cauda = 0 ;
Novo Arr [ cauda ] = val;
}
outro {
cauda ++;
Novo Arr [ cauda ] = val;
}
}
Aqui, chamamos a função “enqueue()” da classe “MyQueue” para inserir o elemento na fila circular se a fila estiver vazia ou com estouro insuficiente. A função “enqueue()” é passada com o parâmetro “val” e insere o valor do final da fila circular. Definimos a condição “if-else” para inserir os valores na fila circular para isso. A primeira instrução “if” que é “if ((head == 0 && tail == Qsize – 1) || (tail == (head – 1) % (Qsize – 1)))” verifica duas condições se o head está na posição inicial e a cauda está na posição final da fila circular. Em seguida, ele verifica se a cauda está em uma posição atrás da cabeça. Se alguma dessas condições for atendida, a fila não estará vazia e o prompt gerará a mensagem.
A seguir, temos a condição “else-if” que identifica se a fila está vazia. Nesse caso, o valor é inserido na fila. Como o head é mantido igual a -1, isso mostra que a fila está vazia e o valor deve ser inserido na fila circular. Para isso, definimos início e cauda iguais a 0. Em seguida, inserimos o valor da posição final na fila circular “NewArr”.
Então, temos nossa terceira condição “else-if” que verifica se o final está na última posição da fila e o início não é a posição inicial da fila. Esta condição se aplica quando a cauda chega ao fim e a posição inicial ainda tem espaço. Para isso, precisamos definir a cabeça em 0, e o elemento é adicionado a partir da posição da cauda. Por último, se todas as condições fornecidas não forem atendidas, a fila não estará vazia nem cheia. Para este caso, incrementamos a cauda em 1 e o valor é adicionado a partir da nova posição da cauda.
Etapa 2: Crie uma função para excluir os elementos do buffer circular
Definimos o código anterior para criar e inserir os elementos na fila circular usando a função enqueue(). Agora, definimos a implementação da remoção dos elementos do buffer circular caso ele estoure.
int MinhaQueue::deQueue ( ){
se ( cabeça == - 1 )
{
corte << ' \n A fila é gratuita' ;
retornar INT_MIN;
}
int MeusDados = NewArr [ cabeça ] ;
Novo Arr [ cabeça ] = -1 ;
se ( cabeça == cauda )
{
cabeça = -1 ;
cauda = -1 ;
}
outro se ( cabeça == Qtamanho - 1 )
cabeça = 0 ;
outro
cabeça ++;
retornar Meus dados;
}
No código fornecido, chamamos a função dequeue() da classe “Myqueue” para remover o elemento do índice principal. Portanto, temos a instrução “if” que verifica se a fila está vazia. O cabeçalho é definido com o valor “-1” que representa a fila vazia. É gerada a mensagem de que a fila está vazia e então retorna o INT_MIN que é o valor mínimo constante para um int. A instrução “if” determina se a fila está desocupada. Para isso, definimos a variável “MyData” e colocamos o valor do elemento no início da fila. Em seguida, colocamos o cabeçalho na posição -1, o que indica que este valor foi removido da fila. Depois disso, verificamos se a cabeça e a cauda são iguais ou não. Se ambos forem iguais, atribuímos o valor “-1” a ambos, representando a fila circular vazia. Por último, verificamos se dequeue() funciona se o cabeçalho estiver no último índice da fila. Para isso, definimos-o com o valor “0” que circula no início do array. Se nenhuma das condições fornecidas for verdadeira, o valor do cabeçalho é incrementado e o elemento retirado da fila é retornado.
Etapa 3: crie uma função para mostrar os elementos do buffer circular
Nesta seção, chamamos a função showQueue() para exibir os elementos da fila circular “NewArr”.
void MyQueue::showQueue ( ){
se ( cabeça == - 1 )
{
corte << ' \n A fila é gratuita' ;
retornar ;
}
corte << ' \n Elementos da fila circular: ' ;
se ( cauda > = cabeça )
{
para ( int eu = cabeça ; eu < = cauda ; eu++ )
corte << Novo Arr [ eu ] << ' ' ;
}
outro
{
para ( int eu = cabeça ; eu < Qtamanho; eu++ )
corte << Novo Arr [ eu ] << ' ' ;
para ( int eu = 0 ; eu < = cauda ; eu++ )
corte << Novo Arr [ eu ] << ' ' ;
}
}
O status vazio da fila é verificado primeiro. Uma indicação de que a fila circular está livre será exibida se a fila estiver livre. Caso contrário, a função mostrará os elementos da fila circular. Para isso, definimos a instrução “if” onde temos a cauda que é maior ou igual à cabeça. Esta condição é definida para tratar o caso quando a fila circular não for concluída.
Para este caso, usamos o loop “for” para iterar do início ao fim e imprimir os valores da fila circular. O próximo caso é onde a fila circular é concluída. Para isso, verificamos usando a condição “if” onde a cauda é menor que a cabeça. Então, precisamos usar dois loops onde o primeiro itera do início ao final da fila e o segundo itera do início do final.
Etapa 4: Crie a função Main() do programa Fila Circular
Por último, criamos a função main() do programa onde inserimos cinco inteiros na fila circular e exibimos os inteiros da fila. Depois disso, mostramos os inteiros excluídos da fila circular chamando a função dequeue(). Após desenfileirar alguns elementos, preenchemos a fila novamente inserindo os novos elementos usando a função enqueue().
principal interno ( ){
MinhaQueue que ( 5 ) ;
// Inserindo elementos em Fila Circular
que.enQueue ( onze ) ;
que.enQueue ( 12 ) ;
que.enQueue ( 13 ) ;
que.enQueue ( 14 ) ;
que.enQueue ( quinze ) ;
// Elementos de exibição presentes em Fila Circular
que.showQueue ( ) ;
// Excluindo elementos da fila circular
corte << ' \n Elemento excluído = ' << que.deQueue ( ) ;
corte << ' \n Elemento excluído = ' << que.deQueue ( ) ;
que.showQueue ( ) ;
que.enQueue ( 16 ) ;
que.enQueue ( 17 ) ;
que.enQueue ( 18 ) ;
que.showQueue ( ) ;
retornar 0 ;
}
Saída:
Os resultados da implementação da fila circular são mostrados na tela de prompt do C++.
Conclusão
Concluindo, o tópico do buffer circular é explicado detalhadamente neste artigo. Criamos primeiro o buffer circular, depois explicamos como excluir da fila circular e, em seguida, exibimos os elementos da circular em C++.