Eksempler på sirkulær buffer i C++

Eksempler Pa Sirkulaer Buffer I C



Sirkulær buffer eller Sirkulær kø er den avanserte versjonen av normalkøen der siste indeks og haleindeks er koblet sammen i en sirkulær struktur. Sirkulær buffer i C++ følger to metoder: enqueue() og dequeue(). Vi utfører den sirkulære bufferen eller den sirkulære køoperasjonen basert på disse metodene.

  • Enqueue()-metoden sjekker om bufferen er fylt. Ellers må du kontrollere at sluttindeksen er den siste. Hvis ja, sett haleverdien til 0. Hvis ikke, øk haleverdien med verdien ved den indeksen.
  • Dequeue()-funksjonen tar verdien fra frontindeksen i den sirkulære køen. Hvis køen er tom, vil en melding vise den tomme køen. Ellers får den den siste verdien og sletter den fra køen.

Program for å implementere en sirkulær buffer i C++

Etter de nevnte to metodene implementerer vi den sirkulære bufferen i C++. La oss vurdere alle trinnene for den sirkulære køimplementeringen i C++.







#include

bruker navneområde std;

struct MyQueue

{

int hode , hale ;

int Qsize;



int * NewArr;



MyQueue ( int no ) {



hode = hale = -1 ;

Qsize = størrelse;

NewArr = ny int [ s ] ;

}



ugyldig kø ( int val ) ;



int deQueue ( ) ;



ugyldig showQueue ( ) ;



} ;



Fra og med koden oppretter vi først «MyQueue»-strukturen for å initialisere hode- og halevariablene. Hodevariabelen representerer frontindeksene og halen representerer en arrays bakre bakindekser. Deretter er størrelsen på den sirkulære køen, betegnet med variabelen 'Qsize', definert.



Deretter definerer vi den dynamisk tildelte matrisen til 'NewArr' som lagrer verdiene til den sirkulære køen. Deretter kaller vi MyQueue() som er en konstruktør og sender 'sz'-parameteren for den sirkulære køstørrelsen. Inne i MyQueue()-konstruktøren tildeler vi '-1'-verdien til hode- og halepekerne. Denne negative verdien indikerer at køen er tom nå. Når vi går videre, tildeler vi 'sz'-verdien som representerer størrelsen på den sirkulære køen. Den sirkulære 'NewArr'-køen er satt med et nytt nøkkelord for å lage matrisen av heltall innenfor den angitte 'sz'-størrelsen.





Deretter definerer vi funksjonene enQueue() og dequeue(). Enqueue() setter inn verdiene i den definerte sirkulære køen fra halen. Imidlertid elimineres elementene i den sirkulære køens hode av funksjonen dequeue(). ShowQueue()-medlemsfunksjonen viser verdiene til den sirkulære køen.

Trinn 1: Lag en funksjon for å sette inn elementene i en sirkulær buffer



I det tidligere trinnet satte vi en klasse der de private medlemmene initialiseres og de private medlemsfunksjonene er satt til å implementere den sirkulære køen. Nå setter vi funksjonen til å lage den sirkulære køen og sette inn verdiene i den sirkulære køen ved hjelp av algoritmen.

void MyQueue::enQueue ( int val )

{

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

{

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

komme tilbake ;

}



ellers hvis ( hode == - 1 )

{

hode = hale = 0 ;

NewArr [ hale ] = val;

}



ellers hvis ( hale == Qsize - 1 && hode ! = 0 )

{

hale = 0 ;

NewArr [ hale ] = val;

}



ellers {

hale ++;

NewArr [ hale ] = val;

}

}

Her kaller vi funksjonen 'enqueue()' fra klassen 'MyQueue' for å sette inn elementet i den sirkulære køen hvis køen er tom eller underflyt. 'enqueue()'-funksjonen sendes med 'val'-parameteren og sett inn verdien fra halen av den sirkulære køen. Vi setter 'hvis-else'-betingelsen for å sette inn verdiene i den sirkulære køen for dette. Den første 'if'-setningen som er 'if ((hode == 0 && hale == Qsize - 1) || (hale == (head - 1) % (Qsize - 1)))' kontrollerer to forhold om hodet er i startposisjonen og halen er i sluttposisjonen til den sirkulære køen. Deretter sjekker den om halen er i en posisjon på baksiden av hodet. Hvis noen av disse betingelsene er oppfylt, er ikke køen tom og ledeteksten genererer meldingen.

Deretter har vi 'else-hvis'-betingelsen som identifiserer om køen er tom. I så fall settes verdien inn i køen. Siden hodet holdes lik -1, viser det at køen er tom og verdien må settes inn i den sirkulære køen. For dette setter vi hodet og halen lik 0. Deretter setter vi inn verdien fra haleposisjonen i den sirkulære 'NewArr'-køen.

Så har vi vår tredje 'else-hvis'-tilstand som sjekker om halen er i den siste posisjonen i køen og hodet ikke er startposisjonen til køen. Denne betingelsen gjelder når halen når slutten og startposisjonen fortsatt har plass. For dette må vi sette hodet til 0, og elementet legges til fra haleposisjonen. Til slutt, hvis alle de gitte betingelsene ikke er oppfylt, er køen verken tom eller full. I dette tilfellet øker vi halen med 1 og verdien legges til fra den nye haleposisjonen.

Trinn 2: Lag en funksjon for å slette elementene fra den sirkulære bufferen

Vi satte den forrige koden for å lage og sette inn elementene i den sirkulære køen ved å bruke funksjonen enqueue(). Nå definerer vi implementeringen av å fjerne elementene fra den sirkulære bufferen hvis den renner over.

int MyQueue::deQueue ( )

{

hvis ( hode == - 1 )

{

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

komme tilbake INT_MIN;

}



int MyData = NewArr [ hode ] ;

NewArr [ hode ] = -1 ;



hvis ( hode == hale )

{

hode = -1 ;

hale = -1 ;

}



ellers hvis ( hode == Qsize - 1 )

hode = 0 ;



ellers

hode ++;



komme tilbake MyData;



}

I den gitte koden kaller vi funksjonen dequeue() fra 'Myqueue'-klassen for å fjerne elementet fra hodeindeksen. Så vi har 'if'-setningen som sjekker om køen er tom. Hodet er satt med '-1' verdien som representerer den tomme køen. Meldingen genereres om at køen er tom og returnerer deretter INT_MIN som er den konstante minimumsverdien for en int. 'Hvis'-setningen avgjør om køen er ledig. For dette definerer vi 'MyData'-variabelen og setter elementets verdi i køens hode. Deretter setter vi hodet til -1-posisjonen som indikerer at denne verdien er fjernet fra køen. Etter dette sjekker vi om hodet og halen er like eller ikke. Hvis begge er like, tildeler vi '-1' verdien til begge, som representerer den tomme sirkulære køen. Til slutt sjekker vi om dequeue() fungerer hvis hodet er på den siste indeksen i køen. For dette setter vi den med verdien '0' som går rundt i starten av matrisen. Hvis ingen av de gitte betingelsene er sanne, økes verdien av hodet og elementet som er satt ut av køen returneres.

Trinn 3: Lag en funksjon for å vise elementene i den sirkulære bufferen

I denne delen kaller vi showQueue()-funksjonen for å vise elementene i den sirkulære 'NewArr'-køen.

void MyQueue::showQueue ( )

{

hvis ( hode == - 1 )

{

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

komme tilbake ;

}



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



hvis ( hale > = hode )

{

til ( int i = hode ; Jeg < = hale ; i++ )

cout << NewArr [ Jeg ] << ' ' ;

}



ellers

{

til ( int i = hode ; Jeg < Qsize; i++ )

cout << NewArr [ Jeg ] << ' ' ;



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

cout << NewArr [ Jeg ] << ' ' ;

}

}

Køens tomme status bekreftes først. En indikasjon på at den sirkulære køen er ledig vises hvis køen er ledig. Ellers vil funksjonen vise elementene i den sirkulære køen. For dette definerer vi 'hvis'-setningen der vi har halen som er større enn eller lik hodet. Denne betingelsen er satt til å håndtere saken når den sirkulære køen ikke er fullført.

I dette tilfellet bruker vi 'for'-løkken for å iterere fra hode til hale og skrive ut verdiene til den sirkulære køen. Det neste tilfellet er hvor den sirkulære køen er fullført. For dette sjekker vi ved å bruke 'hvis'-tilstanden der halen er mindre enn hodet. Deretter må vi bruke to løkker der den første itererer fra hodet til slutten av køen og den andre itererer fra starten av halen.

Trinn 4: Opprett Main()-funksjonen til Circular Queue-programmet

Til slutt lager vi programmets hoved()-funksjon der vi setter inn fem heltall i den sirkulære køen og viser heltallene i køen. Etter det viser vi de slettede heltallene fra den sirkulære køen ved å kalle opp funksjonen dequeue(). Etter å ha fjernet noen få elementer, fyller vi køen igjen ved å sette inn de nye elementene ved å bruke enqueue()-funksjonen.

int main ( )

{

MyQueue det ( 5 ) ;



// Sette inn elementer i Sirkulær kø

que.enQueue ( elleve ) ;

que.enQueue ( 12 ) ;

que.enQueue ( 1. 3 ) ;

que.enQueue ( 14 ) ;

que.enQueue ( femten ) ;



// Visningselementer til stede i Sirkulær kø

que.showQueue ( ) ;



// Sletter elementer fra Circular Queue

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 ( ) ;



komme tilbake 0 ;



}

Produksjon:

Resultatene av implementeringen av den sirkulære køen vises på C++-ledetekstskjermen.

Konklusjon

Avslutningsvis er det sirkulære bufferemnet dypt forklart i denne artikkelen. Vi opprettet den sirkulære bufferen først, forklarte deretter hvordan du sletter fra den sirkulære køen, og viste deretter elementene i rundskrivet i C++.