Примери кружног бафера у Ц++

Primeri Kruznog Bafera U C



Кружни бафер или кружни ред је напредна верзија нормалног реда где су последњи индекс и репни индекс повезани у кружну структуру. Кружни бафер у Ц++ прати две методе: енкуеуе() и декуеуе(). На основу ових метода изводимо кружни бафер или кружни ред чекања.

  • Метода енкуеуе() проверава да ли је бафер попуњен. У супротном, проверите да ли је крајњи индекс последњи. Ако јесте, поставите вредност репа на 0. Ако није, повећајте вредност репа за вредност у том индексу.
  • Функција декуеуе() узима вредност из предњег индекса у кружном реду. Ако је ред празан, порука ће приказати тај празан ред. У супротном, добија последњу вредност и брише је из реда.

Програм за имплементацију кружног бафера у Ц++

Пратећи поменуте две методе, имплементирамо кружни бафер у Ц++. Хајде да размотримо све кораке за имплементацију кружног реда у Ц++.







#инцлуде<битс/стдц++.х>

користећи простор имена стд;

струцт МиКуеуе

{

инт глава , Реп ;

инт Ксизе;



инт * НевАрр;



МиКуеуе ( инт бр ) {



глава = Реп = -1 ;

Ксизе = величина;

НевАрр = нови инт [ с ] ;

}



воид енКуеуе ( инт вал ) ;



инт деКуеуе ( ) ;



воид сховКуеуе ( ) ;



} ;



Почевши од кода, прво креирамо структуру „МиКуеуе“ да иницијализујемо променљиве главе и репа. Варијабла главе представља предње индексе, а реп представља задње задње индексе низа. Након тога се дефинише величина кружног реда, означена променљивом „Ксизе“.



Затим дефинишемо динамички додељени низ „НевАрр“ који чува вредности кружног реда. Затим позивамо МиКуеуе() који је конструктор и прослеђујемо параметар „сз“ за величину кружног реда. Унутар МиКуеуе() конструктора, додељујемо вредност „-1“ показивачима главе и репа. Ова негативна вредност указује да је ред сада празан. Крећући се напред, додељујемо вредност „сз“ која представља величину кружног реда. „НевАрр“ кружни ред је постављен новом кључном речи да би се креирао низ целих бројева унутар наведене величине „сз“.





Затим дефинишемо функције енКуеуе() и декуеуе(). Енкуеуе() убацује вредности у дефинисани кружни ред из репа. Међутим, елементи у глави кружног реда се елиминишу помоћу функције декуеуе(). Функција члана сховКуеуе() приказује вредности кружног реда.

Корак 1: Креирајте функцију за уметање елемената у кружни бафер



У ранијем кораку, поставили смо класу где су приватни чланови иницијализовани, а функције приватних чланова су подешене да имплементирају кружни ред. Сада смо поставили функцију да креира кружни ред и убацимо вредности унутар кружног реда користећи алгоритам.

воид МиКуеуе::енКуеуе ( инт вал )

{

ако ( ( глава == 0 && Реп == Ксизе - 1 ) || ( Реп == ( глава - 1 ) % ( Ксизе - 1 ) ) )

{

цоут << ' Ред је попуњен' ;

повратак ;

}



друго ако ( глава == - 1 )

{

глава = Реп = 0 ;

НевАрр [ Реп ] = вал;

}



друго ако ( Реп == Ксизе - 1 && глава ! = 0 )

{

Реп = 0 ;

НевАрр [ Реп ] = вал;

}



друго {

Реп ++;

НевАрр [ Реп ] = вал;

}

}

Овде позивамо функцију „енкуеуе()“ из класе „МиКуеуе“ да бисмо уметнули елемент у кружни ред ако је ред празан или недовољан. Функција “енкуеуе()” се прослеђује са параметром “вал” и убацује вредност из репа кружног реда. Поставили смо услов „ако-елсе“ да убацимо вредности у кружни ред за ово. Прва „иф“ изјава која је „иф ((глава == 0 && реп == Ксизе – 1) || (реп == (глава – 1) % (Ксизе – 1)))” проверава два услова да ли је глава је на почетној позицији, а реп је на крајњој позицији кружног реда. Затим проверава да ли је реп у једном положају у положају позади главе. Ако је било који од ових услова испуњен, ред није празан и промпт генерише поруку.

Затим имамо услов „друго ако“ који идентификује да ли је ред празан. Ако је тако, вредност се убацује у ред. Пошто је глава једнака -1, то показује да је ред празан и да се вредност мора убацити у кружни ред. За ово постављамо хеад и таил једнаке 0. Затим убацујемо вредност са позиције репа у „НевАрр“ кружни ред.

Затим, имамо наш трећи услов „елсе-иф“ који проверава да ли је реп на последњој позицији реда, а глава није почетна позиција реда. Овај услов се примењује када реп стигне до краја, а почетна позиција још увек има простора. За ово, треба да поставимо главу на 0, а елемент се додаје са позиције репа. На крају, ако нису испуњени сви задати услови, ред није ни празан ни пун. У овом случају, повећавамо реп за 1 и вредност се додаје са нове позиције репа.

Корак 2: Креирајте функцију за брисање елемената из кружног бафера

Поставили смо претходни код за креирање и уметање елемената у кружни ред помоћу функције енкуеуе(). Сада дефинишемо имплементацију уклањања елемената из кружног бафера ако се он препуни.

инт МиКуеуе::деКуеуе ( )

{

ако ( глава == - 1 )

{

цоут << ' Ред је слободан' ;

повратак ИНТ_МИН;

}



инт МиДата = НевАрр [ глава ] ;

НевАрр [ глава ] = -1 ;



ако ( глава == Реп )

{

глава = -1 ;

Реп = -1 ;

}



друго ако ( глава == Ксизе - 1 )

глава = 0 ;



друго

глава ++;



повратак МиДата;



}

У датом коду позивамо функцију декуеуе() из класе „Микуеуе“ да бисмо уклонили елемент из индекса главе. Дакле, имамо наредбу „иф“ која проверава да ли је ред празан. Глава је постављена са вредношћу „-1“ која представља празан ред. Генерише се порука да је ред празан, а затим враћа ИНТ_МИН што је константна минимална вредност за инт. Наредба „иф“ одређује да ли је ред незаузет. За ово дефинишемо променљиву „МиДата“ и постављамо вредност елемента у главу реда. Затим постављамо главу на позицију -1 што указује да је ова вредност уклоњена из реда. После овога проверавамо да ли су глава и реп једнаки или не. Ако су оба једнака, додељујемо вредност „-1“ обема, што представља празан кружни ред. На крају, проверавамо да ли декуеуе() функционише ако је глава на последњем индексу реда. За ово смо га поставили са вредношћу „0“ која се врти около на почетку низа. Ако ниједан од датих услова није тачан, вредност главе се повећава и враћа се елемент који је искључен из реда.

Корак 3: Креирајте функцију за приказ елемената кружног бафера

У овом одељку позивамо функцију сховКуеуе() да прикажемо елементе кружног реда „НевАрр“.

воид МиКуеуе::сховКуеуе ( )

{

ако ( глава == - 1 )

{

цоут << ' Ред је слободан' ;

повратак ;

}



цоут << ' Елементи кружног реда: ' ;



ако ( Реп > = глава )

{

за ( инт и = глава ; и < = Реп ; и++ )

цоут << НевАрр [ и ] << ' ' ;

}



друго

{

за ( инт и = глава ; и < Ксизе; и++ )

цоут << НевАрр [ и ] << ' ' ;



за ( инт и = 0 ; и < = Реп ; и++ )

цоут << НевАрр [ и ] << ' ' ;

}

}

Прво се проверава празан статус реда. Индикација да је кружни ред слободан приказује се ако је ред слободан. У супротном, функција ће приказати елементе кружног реда. За ово дефинишемо изјаву „ако“ где имамо реп који је већи или једнак глави. Овај услов је подешен да обради случај када кружни ред није завршен.

У овом случају, користимо петљу „фор“ за понављање од главе до репа и штампање вредности кружног реда. Следећи случај је када је кружни ред завршен. За ово проверавамо помоћу услова „ако“ где је реп мањи од главе. Затим, треба да користимо две петље где се прва понавља од главе до краја реда, а друга од почетка репа.

Корак 4: Креирајте Маин() функцију програма кружног реда

На крају, креирамо функцију маин() програма где убацујемо пет целих бројева у кружни ред и приказујемо целе бројеве реда. Након тога приказујемо обрисане целе бројеве из кружног реда позивањем функције декуеуе(). Након уклањања неколико елемената из реда, поново попуњавамо ред уметањем нових елемената помоћу функције енкуеуе().

инт маин ( )

{

МиКуеуе тхат ( 5 ) ;



// Уметање елемената ин Цирцулар Куеуе

куе.енКуеуе ( Једанаест ) ;

куе.енКуеуе ( 12 ) ;

куе.енКуеуе ( 13 ) ;

куе.енКуеуе ( 14 ) ;

куе.енКуеуе ( петнаест ) ;



// Приказани елементи ин Цирцулар Куеуе

куе.сховКуеуе ( ) ;



// Брисање елемената из кружног реда

цоут << ' Избрисани елемент = ' << куе.деКуеуе ( ) ;

цоут << ' Избрисани елемент = ' << куе.деКуеуе ( ) ;



куе.сховКуеуе ( ) ;



куе.енКуеуе ( 16 ) ;

куе.енКуеуе ( 17 ) ;

куе.енКуеуе ( 18 ) ;



куе.сховКуеуе ( ) ;



повратак 0 ;



}

Излаз:

Резултати имплементације кружног реда су приказани на екрану Ц++ промпта.

Закључак

У закључку, тема кружног бафера је детаљно објашњена у овом чланку. Прво смо креирали кружни бафер, затим објаснили како да избришете из кружног реда, а затим приказали елементе кружног у Ц++.