Exemplos de buffer circular em C++

Exemplos De Buffer Circular Em C



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++.