Cirkulære buffereksempler i C++

Cirkulaere Buffereksempler I C



Cirkulær buffer eller cirkulær kø er den avancerede version af den normale kø, hvor det sidste indeks og haleindeks er forbundet i en cirkulær struktur. Cirkulær buffer i C++ følger to metoder: enqueue() og dequeue(). Vi udfører den cirkulære buffer eller cirkulære køoperation baseret på disse metoder.

  • Metoden enqueue() kontrollerer, om bufferen er fyldt. Ellers skal du kontrollere, at slutindekset er det sidste. Hvis det er tilfældet, skal du indstille haleværdien til 0. Hvis ikke, øges haleværdien med værdien ved det indeks.
  • Funktionen dequeue() tager værdien fra det forreste indeks i den cirkulære kø. Hvis køen er tom, vil en meddelelse vise den tomme kø. Ellers får den den sidste værdi og sletter den fra køen.

Program til at implementere en cirkulær buffer i C++

Efter de nævnte to metoder implementerer vi den cirkulære buffer i C++. Lad os overveje alle trinene til implementeringen af ​​den cirkulære kø i C++.







#include

bruger navneområde std;

struct MyQueue

{

int hoved , hale ;

int Qsize;



int * NewArr;



Min Kø ( int nr ) {



hoved = hale = -1 ;

Qsize = størrelse;

NewArr = ny int [ s ] ;

}



ugyldig kø ( int val ) ;



int deQueue ( ) ;



ugyldig showQueue ( ) ;



} ;



Begyndende med koden opretter vi først 'MyQueue'-strukturen for at initialisere hoved- og halevariablerne. Hovedvariablen repræsenterer de forreste indekser, og halen repræsenterer et arrays bageste indekser. Derefter defineres den cirkulære køs størrelse, angivet med variablen 'Qsize'.



Derefter definerer vi det dynamisk allokerede array af 'NewArr', som gemmer værdierne af den cirkulære kø. Dernæst kalder vi MyQueue(), som er en konstruktør, og sender parameteren 'sz' for den cirkulære køstørrelse. Inde i MyQueue()-konstruktøren tildeler vi '-1'-værdien til hoved- og halepegerne. Denne negative værdi angiver, at køen er tom nu. Når vi går videre, tildeler vi 'sz'-værdien, der repræsenterer størrelsen af ​​den cirkulære kø. Den cirkulære 'NewArr'-kø er sat med et nyt nøgleord for at skabe arrayet af heltal inden for den angivne 'sz'-størrelse.





Derefter definerer vi funktionerne enQueue() og dequeue(). Enqueue() indsætter værdierne i den definerede cirkulære kø fra halen. Imidlertid elimineres elementerne i den cirkulære køs hoved af funktionen dequeue(). ShowQueue()-medlemsfunktionen viser værdierne af den cirkulære kø.

Trin 1: Opret en funktion til at indsætte elementerne i en cirkulær buffer



I det tidligere trin satte vi en klasse, hvor de private medlemmer initialiseres, og de private medlemsfunktioner indstilles til at implementere den cirkulære kø. Nu indstiller vi funktionen til at oprette den cirkulære kø og indsætte værdierne i den cirkulære kø ved hjælp af algoritmen.

void MyQueue::enQueue ( int val )

{

hvis ( ( hoved == 0 && hale == Qsize - 1 ) || ( hale == ( hoved - 1 ) % ( Qsize - 1 ) ) )

{

cout << ' \n Køen er fyldt' ;

Vend tilbage ;

}



andet hvis ( hoved == - 1 )

{

hoved = hale = 0 ;

NewArr [ hale ] = val;

}



andet hvis ( hale == Qsize - 1 && hoved ! = 0 )

{

hale = 0 ;

NewArr [ hale ] = val;

}



andet {

hale ++;

NewArr [ hale ] = val;

}

}

Her kalder vi 'enqueue()'-funktionen fra 'MyQueue'-klassen for at indsætte elementet i den cirkulære kø, hvis køen er tom eller underløb. Funktionen 'enqueue()' sendes med parameteren 'val' og indsæt værdien fra halen af ​​den cirkulære kø. Vi indstiller betingelsen 'hvis-else' for at indsætte værdierne i den cirkulære kø for dette. Den første 'hvis'-sætning, som er 'hvis ((hoved == 0 && hale == Qsize – 1) || (hale == (hoved – 1) % (Qsize – 1)))' kontrollerer to betingelser, om hovedet er i startpositionen og halen er i slutpositionen af ​​den cirkulære kø. Derefter kontrollerer den, om halen er i en position bagerst i hovedpositionen. Hvis nogen af ​​disse betingelser er opfyldt, er køen ikke tom, og prompten genererer meddelelsen.

Dernæst har vi betingelsen 'else-hvis', der identificerer, om køen er tom. Hvis det er tilfældet, indsættes værdien i køen. Da hovedet holdes lig med -1, viser det, at køen er tom, og værdien skal indsættes i den cirkulære kø. Til dette sætter vi hovedet og halen lig med 0. Derefter indsætter vi værdien fra halepositionen i den cirkulære 'NewArr'-kø.

Så har vi vores tredje 'else-hvis'-tilstand, som kontrollerer, om halen er i den sidste position i køen, og hovedet ikke er startpositionen for køen. Denne betingelse gælder, når halen når enden, og startpositionen stadig har plads. Til dette skal vi indstille hovedet til 0, og elementet tilføjes fra halepositionen. Til sidst, hvis alle de givne betingelser ikke er opfyldt, er køen hverken tom eller fuld. I dette tilfælde øger vi halen med 1, og værdien tilføjes fra den nye haleposition.

Trin 2: Opret en funktion til at slette elementerne fra den cirkulære buffer

Vi indstiller den forrige kode til at oprette og indsætte elementerne i den cirkulære kø ved hjælp af enqueue()-funktionen. Nu definerer vi implementeringen af ​​at fjerne elementerne fra den cirkulære buffer, hvis den løber over.

int MyQueue::deQueue ( )

{

hvis ( hoved == - 1 )

{

cout << ' \n Køen er gratis' ;

Vend tilbage INT_MIN;

}



int MyData = NewArr [ hoved ] ;

NewArr [ hoved ] = -1 ;



hvis ( hoved == hale )

{

hoved = -1 ;

hale = -1 ;

}



andet hvis ( hoved == Qsize - 1 )

hoved = 0 ;



andet

hoved ++;



Vend tilbage MyData;



}

I den givne kode kalder vi funktionen dequeue() fra klassen 'Myqueue' for at fjerne elementet fra hovedindekset. Så vi har 'hvis'-erklæringen, der kontrollerer, om køen er tom. Hovedet er indstillet med '-1' værdien, der repræsenterer den tomme kø. Meddelelsen genereres om, at køen er tom, og returnerer derefter INT_MIN, som er den konstante minimumværdi for en int. 'Hvis'-erklæringen afgør, om køen er ubesat. Til dette definerer vi 'MyData'-variablen og indstiller elementets værdi i køens hoved. Derefter sætter vi hovedet på -1-positionen, hvilket indikerer, at denne værdi er fjernet fra køen. Herefter kontrollerer vi, om hoved og hale er ens eller ej. Hvis begge er ens, tildeler vi '-1' værdien til begge, hvilket repræsenterer den tomme cirkulære kø. Til sidst tjekker vi, om dequeue() fungerer, hvis hovedet er ved det sidste indeks i køen. Til dette sætter vi den med værdien '0', som går rundt i starten af ​​arrayet. Hvis ingen af ​​de givne betingelser er sande, øges værdien af ​​hovedet, og det udkøede element returneres.

Trin 3: Opret en funktion til at vise elementerne i den cirkulære buffer

I dette afsnit kalder vi funktionen showQueue() for at vise elementerne i den cirkulære 'NewArr'-kø.

void MyQueue::showQueue ( )

{

hvis ( hoved == - 1 )

{

cout << ' \n Køen er gratis' ;

Vend tilbage ;

}



cout << ' \n Cirkulære køelementer: ' ;



hvis ( hale > = hoved )

{

til ( int i = hoved ; jeg < = hale ; i++ )

cout << NewArr [ jeg ] << ' ' ;

}



andet

{

til ( int i = hoved ; jeg < Qsize; i++ )

cout << NewArr [ jeg ] << ' ' ;



til ( int i = 0 ; jeg < = hale ; i++ )

cout << NewArr [ jeg ] << ' ' ;

}

}

Køens tomme status bekræftes først. En indikation af, at den cirkulære kø er ledig, vises, hvis køen er ledig. Ellers vil funktionen vise elementerne i den cirkulære kø. Til dette definerer vi 'hvis'-sætningen, hvor vi har halen, der er større end eller lig med hovedet. Denne betingelse er sat til at håndtere sagen, når den cirkulære kø ikke er afsluttet.

I dette tilfælde bruger vi 'for'-løkken til at iterere fra hoved til hale og udskrive værdierne for den cirkulære kø. Det næste tilfælde er, hvor den cirkulære kø afsluttes. Til dette kontrollerer vi ved at bruge 'hvis'-tilstanden, hvor halen er mindre end hovedet. Derefter skal vi bruge to sløjfer, hvor den første itererer fra hovedet til slutningen af ​​køen, og den anden itererer fra starten af ​​halen.

Trin 4: Opret Main()-funktionen i Circular Queue-programmet

Til sidst opretter vi programmets main() funktion, hvor vi indsætter fem heltal i den cirkulære kø og viser køens heltal. Derefter viser vi de slettede heltal fra den cirkulære kø ved at kalde funktionen dequeue(). Efter at have sat nogle få elementer i kø, udfylder vi køen igen ved at indsætte de nye elementer ved hjælp af enqueue()-funktionen.

int main ( )

{

MyQueue det ( 5 ) ;



// Indsættelse af elementer i Cirkulær kø

que.enQueue ( elleve ) ;

que.enQueue ( 12 ) ;

que.enQueue ( 13 ) ;

que.enQueue ( 14 ) ;

que.enQueue ( femten ) ;



// Displayelementer til stede i Cirkulær kø

que.showQueue ( ) ;



// Sletning af elementer fra cirkulær kø

cout << ' \n Slettet element = ' << que.deQueue ( ) ;

cout << ' \n Slettet element = ' << que.deQueue ( ) ;



que.showQueue ( ) ;



que.enQueue ( 16 ) ;

que.enQueue ( 17 ) ;

que.enQueue ( 18 ) ;



que.showQueue ( ) ;



Vend tilbage 0 ;



}

Produktion:

Resultaterne af implementeringen af ​​den cirkulære kø vises på C++-promptskærmen.

Konklusion

Afslutningsvis er det cirkulære bufferemne dybt forklaret i denne artikel. Vi oprettede først den cirkulære buffer, forklarede derefter, hvordan man sletter fra den cirkulære kø, og viste derefter elementerne i cirkulæren i C++.