logo

Кръгова опашка

Защо беше въведена концепцията за кръговата опашка?

Имаше едно ограничение в изпълнението на масива

Както можем да видим на горното изображение, задната част е на последната позиция на опашката, а предната част сочи някъде, а не 0thпозиция. В горния масив има само два елемента, а останалите три позиции са празни. Задната част е на последната позиция на опашката; ако се опитаме да вмъкнем елемента, той ще покаже, че няма празни места в опашката. Има едно решение за избягване на такава загуба на памет, като преместите двата елемента вляво и съответно регулирате предния и задния край. Това не е практически добър подход, защото преместването на всички елементи ще отнеме много време. Ефикасният подход за избягване на разхищението на паметта е да се използва структурата на данните на кръговата опашка.

Какво е кръгова опашка?

Кръговата опашка е подобна на линейната опашка, тъй като също се основава на принципа FIFO (First In First Out), с изключение на това, че последната позиция е свързана с първата позиция в кръгла опашка, която образува кръг. Известен е още като a Буфер за звънене .

изключете режима за програмисти

Операции върху кръгова опашка

Следните са операциите, които могат да бъдат извършени върху кръгова опашка:

    Предна част:Използва се за получаване на предния елемент от опашката.Задна част:Използва се за получаване на задния елемент от опашката.enQueue(стойност):Тази функция се използва за вмъкване на новата стойност в опашката. Новият елемент винаги се поставя откъм задния край.деQueue():Тази функция изтрива елемент от опашката. Изтриването в опашка винаги се извършва от предния край.

Приложения на Circular Queue

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

    Управление на паметта:Кръговата опашка осигурява управление на паметта. Както вече видяхме, че в линейната опашка паметта не се управлява много ефективно. Но в случай на кръгова опашка, паметта се управлява ефективно чрез поставяне на елементите на място, което не се използва.График на процесора:Операционната система също използва кръговата опашка, за да вмъкне процесите и след това да ги изпълни.Система за движение:В система за компютърно управление на трафика светофарът е един от най-добрите примери за кръгова опашка. Всяка светлина на светофара светва една по една след всеки интервал от време. Като червена светлина светва за една минута, след това жълта светлина за една минута и след това зелена светлина. След зелена светлина светва червената светлина.

Операция за поставяне на опашка

Стъпките на операцията на опашка са дадени по-долу:

  • Първо ще проверим дали опашката е пълна или не.
  • Първоначално предната и задната част са настроени на -1. Когато вмъкнем първия елемент в опашка, предната и задната част са зададени на 0.
  • Когато вмъкнем нов елемент, задната част се увеличава, т.е. отзад=отзад+1 .

Сценарии за вмъкване на елемент

Има два сценария, при които опашката не е пълна:

    Ако отзад != max - 1, тогава задната ще бъде увеличена до мод (максимален размер) и новата стойност ще бъде вмъкната в задния край на опашката.Ако отпред != 0 и отзад = max - 1, това означава, че опашката не е пълна, след това задайте стойността на rear на 0 и вмъкнете новия елемент там.

Има два случая, в които елементът не може да бъде вмъкнат:

  • Кога отпред ==0 && отзад = max-1 , което означава, че предната част е на първата позиция на опашката, а задната е на последната позиция на опашката.
  • преден== заден + 1;

Алгоритъм за вмъкване на елемент в кръгова опашка

Етап 1: АКО (ЗАДНО+1)%МАКС = ПРЕДНО
Напишете 'OVERFLOW'
Отидете на стъпка 4
[КРАЙ НА АКО]

Стъпка 2: АКО ПРЕДЕН = -1 и ЗАДЕН = -1
НАСТРОЙКА ПРЕДНА = ЗАДНА = 0
ИНАЧЕ, АКО ЗАДНА = МАКС - 1 и ПРЕДНА! = 0
SET REAR = 0
ДРУГО
НАСТРОЙКА ЗАДНА = (ЗАДНА + 1) % МАКС
[КРАЙ НА АКО]

Стъпка 3: ЗАДАВАНЕ НА ОПАШКА [ОТЗАД] = VAL

kali linux команди

Стъпка 4: ИЗХОД

Операция за премахване на опашката

Стъпките на операцията за премахване на опашката са дадени по-долу:

  • Първо проверяваме дали опашката е празна или не. Ако опашката е празна, не можем да изпълним операцията за премахване на опашката.
  • Когато елементът бъде изтрит, стойността на front се намалява с 1.
  • Ако е останал само един елемент, който трябва да бъде изтрит, тогава предната и задната част се нулират на -1.

Алгоритъм за изтриване на елемент от кръговата опашка

Етап 1: АКО ПРЕД = -1
Напишете „UNDERFLOW“
Отидете на стъпка 4
[КРАЙ на АКО]

Стъпка 2: SET VAL = QUEUE[FRONT]

Стъпка 3: АКО ПРЕДНА = ЗАДНА
НАСТРОЙКА ПРЕДНА = ЗАДНА = -1
ДРУГО
АКО ОТПРЕД = МАКС. -1
SET FRONT = 0
ДРУГО
НАБОР ПРЕДНА = ПРЕДНА + 1
[КРАЙ на АКО]
[КРАЙ НА АКО]

Стъпка 4: ИЗХОД

Нека разберем операцията за поставяне и изваждане от опашка чрез диаграмното представяне.

Кръгова опашка
Кръгова опашка
Кръгова опашка
Кръгова опашка
Кръгова опашка
Кръгова опашка
Кръгова опашка
Кръгова опашка

Внедряване на кръгова опашка с помощта на Array

 #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)>

Изход:

Кръгова опашка