logo

Цирцулар Куеуе

Зашто је уведен концепт кружног реда?

Постојало је једно ограничење у имплементацији низа

Као што можемо видети на горњој слици, задњи део је на последњој позицији реда, а предњи је усмерен негде, а не 0тхположај. У горњем низу постоје само два елемента, а остале три позиције су празне. Задњи део је на последњој позицији реда; ако покушамо да убацимо елемент онда ће се показати да у реду чекања нема празних места. Постоји једно решење да се избегне такво трошење меморијског простора померањем оба елемента лево и прилагођавањем предњег и задњег краја у складу са тим. То није практично добар приступ јер ће померање свих елемената одузети много времена. Ефикасан приступ да се избегне губитак меморије је коришћење структуре података кружног реда.

Шта је кружни ред?

Кружни ред је сличан линеарном реду јер је такође заснован на ФИФО (Фирст Ин Фирст Оут) принципу осим што је последња позиција повезана са првом позицијом у кружном реду који формира круг. Такође је познат као а Ринг Буффер .

Операције на кружном реду

Следе операције које се могу извршити на кружном реду:

    Фронт:Користи се за добијање предњег елемента из реда чекања.Задњи:Користи се за добијање задњег елемента из реда чекања.енКуеуе(вредност):Ова функција се користи за уметање нове вредности у ред чекања. Нови елемент се увек убацује са задње стране.деКуеуе():Ова функција брише елемент из реда чекања. Брисање у Реду се увек одвија са предњег краја.

Примене кружног чекања

Кружни ред се може користити у следећим сценаријима:

    Управљање меморијом:Кружни ред чекања обезбеђује управљање меморијом. Као што смо већ видели да се у линеарном реду, меморијом не управља веома ефикасно. Али у случају кружног реда, меморијом се ефикасно управља тако што се елементи постављају на локацију која се не користи.Планирање процесора:Оперативни систем такође користи кружни ред да убаци процесе и затим их изврши.Саобраћајни систем:У систему компјутерске контроле саобраћаја, семафор је један од најбољих примера кружног реда. Свако светло семафора се пали једно по једно после сваког временског интервала. Као што се црвено светло упали на један минут, затим жуто светло на један минут и затим зелено светло. Након зеленог светла, црвено светло се пали.

Операција у реду чекања

Кораци операције у реду су дати у наставку:

  • Прво ћемо проверити да ли је ред пун или не.
  • У почетку су предњи и задњи постављени на -1. Када убацимо први елемент у ред чекања, оба предња и задња су постављена на 0.
  • Када убацимо нови елемент, задњи део се повећава, тј. позади=позади+1 .

Сценарији за уметање елемента

Постоје два сценарија у којима ред није пун:

    Ако је задњи != мак - 1, онда ће задњи део бити повећан на мод (максимална величина) а нова вредност ће бити уметнута на задњи крај реда.Ако је предњи != 0 и задњи = мак - 1, то значи да ред није пун, а затим поставите вредност реар на 0 и убаците нови елемент тамо.

Постоје два случаја у којима се елемент не може уметнути:

  • Када фронт ==0 && задњи = мак-1 , што значи да је предњи део на првој позицији реда, а задњи на последњој позицији реда.
  • предњи== задњи + 1;

Алгоритам за уметање елемента у кружни ред чекања

Корак 1: ИФ (РЕАР+1)%МАКС = ФРОНТ
Напишите 'ОВЕРФЛОВ'
Идите на корак 4
[Крај ИФ]

Корак 2: АКО ПРЕДЊА = -1 и ЗАДЊА = -1
СЕТ ПРЕДЊА = ЗАДЊА = 0
АКО АКО ЗАДЊЕ = МАКС-1 и ПРЕДЊЕ! = 0
ПОСТАВИ ЗАДЊЕ = 0
ЕЛСЕ
СЕТ РЕАР = (РЕАР + 1) % МАКС
[КРАЈ АКО]

Корак 3: СЕТ КУЕУЕ[РЕАР] = ВАЛ

турбо ц++ преузимање

4. корак: ИЗЛАЗ

Декуеуе Оператион

Кораци операције декуеуе су дати у наставку:

  • Прво, проверавамо да ли је Ред празан или не. Ако је ред празан, не можемо извршити операцију декуеуа.
  • Када се елемент избрише, вредност фронта се смањује за 1.
  • Ако је остао само један елемент који треба обрисати, онда се предњи и задњи део враћају на -1.

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

Корак 1: АКО ПРЕДЊА = -1
Напишите 'УНДЕРФЛОВ'
Идите на корак 4
[КРАЈ ИФ]

Корак 2: СЕТ ВАЛ = РЕДО[ПРЕДЊИ]

Корак 3: АКО ПРЕДЊА = ЗАДЊА
СЕТ ПРЕДЊА = ЗАДЊА = -1
ЕЛСЕ
АКО ПРЕДЊА = МАКС -1
СЕТ ФРОНТ = 0
ЕЛСЕ
СЕТ ФРОНТ = ФРОНТ + 1
[КРАЈ ИФ]
[КРАЈ АКО]

4. корак: ИЗЛАЗ

Хајде да разумемо операције чекања и декуеуа кроз дијаграмски приказ.

Цирцулар Куеуе
Цирцулар Куеуе
Цирцулар Куеуе
Цирцулар Куеуе
Цирцулар Куеуе
Цирцулар Куеуе
Цирцулар Куеуе
Цирцулар Куеуе

Имплементација кружног реда помоћу низа

 #include # define max 6 int queue[max]; // array declaration int front=-1; int rear=-1; // function to insert an element in a circular queue void enqueue(int element) { if(front==-1 && rear==-1) // condition to check queue is empty { front=0; rear=0; queue[rear]=element; } else if((rear+1)%max==front) // condition to check queue is full { printf('Queue is overflow..'); } else { rear=(rear+1)%max; // rear is incremented queue[rear]=element; // assigning a value to the queue at the rear position. } } // function to delete the element from the queue int dequeue() { if((front==-1) && (rear==-1)) // condition to check queue is empty { printf('
Queue is underflow..'); } else if(front==rear) { printf('
The dequeued element is %d', queue[front]); front=-1; rear=-1; } else { printf('
The dequeued element is %d', queue[front]); front=(front+1)%max; } } // function to display the elements of a queue void display() { int i=front; if(front==-1 && rear==-1) { printf('
 Queue is empty..'); } else { printf('
Elements in a Queue are :&apos;); while(i<=rear) { printf('%d,', queue[i]); i="(i+1)%max;" } int main() choice="1,x;" variables declaration while(choice<4 && choice!="0)" while loop printf('
 press 1: insert an element'); printf('
press 2: delete 3: display the printf('
enter your choice'); scanf('%d', &choice); switch(choice) case printf('enter element which is to be inserted'); &x); enqueue(x); break; dequeue(); display(); }} return 0; < pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/ds-tutorial/14/circular-queue-10.webp" alt="Circular Queue"> <h3>Implementation of circular queue using linked list</h3> <p>As we know that linked list is a linear data structure that stores two parts, i.e., data part and the address part where address part contains the address of the next node. Here, linked list is used to implement the circular queue; therefore, the linked list follows the properties of the Queue. When we are implementing the circular queue using linked list then both the <strong> <em>enqueue and dequeue</em> </strong> operations take <strong> <em>O(1)</em> </strong> time.</p> <pre> #include // Declaration of struct type node struct node { int data; struct node *next; }; struct node *front=-1; struct node *rear=-1; // function to insert the element in the Queue void enqueue(int x) { struct node *newnode; // declaration of pointer of struct node type. newnode=(struct node *)malloc(sizeof(struct node)); // allocating the memory to the newnode newnode-&gt;data=x; newnode-&gt;next=0; if(rear==-1) // checking whether the Queue is empty or not. { front=rear=newnode; rear-&gt;next=front; } else { rear-&gt;next=newnode; rear=newnode; rear-&gt;next=front; } } // function to delete the element from the queue void dequeue() { struct node *temp; // declaration of pointer of node type temp=front; if((front==-1)&amp;&amp;(rear==-1)) // checking whether the queue is empty or not { printf(&apos;
Queue is empty&apos;); } else if(front==rear) // checking whether the single element is left in the queue { front=rear=-1; free(temp); } else { front=front-&gt;next; rear-&gt;next=front; free(temp); } } // function to get the front of the queue int peek() { if((front==-1) &amp;&amp;(rear==-1)) { printf(&apos;
Queue is empty&apos;); } else { printf(&apos;
The front element is %d&apos;, front-&gt;data); } } // function to display all the elements of the queue void display() { struct node *temp; temp=front; printf(&apos;
 The elements in a Queue are : &apos;); if((front==-1) &amp;&amp; (rear==-1)) { printf(&apos;Queue is empty&apos;); } else { while(temp-&gt;next!=front) { printf(&apos;%d,&apos;, temp-&gt;data); temp=temp-&gt;next; } printf(&apos;%d&apos;, temp-&gt;data); } } void main() { enqueue(34); enqueue(10); enqueue(23); display(); dequeue(); peek(); } </pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/ds-tutorial/14/circular-queue-11.webp" alt="Circular Queue"> <hr></=rear)>

Излаз:

Цирцулар Куеуе