logo

Coada circulară

De ce a fost introdus conceptul de coadă circulară?

A existat o limitare în implementarea matricei

După cum putem vedea în imaginea de mai sus, partea din spate este în ultima poziție a cozii, iar față este îndreptată undeva, mai degrabă decât 0.thpoziţie. În matricea de mai sus, există doar două elemente și alte trei poziții sunt goale. Spatele este la ultima pozitie a Cozii; dacă încercăm să inserăm elementul, atunci va arăta că nu există spații goale în coadă. Există o soluție pentru a evita o astfel de risipă de spațiu de memorie prin deplasarea ambelor elemente din stânga și ajustarea în consecință a părții din față și din spate. Nu este o abordare practic bună, deoarece schimbarea tuturor elementelor va consuma mult timp. Abordarea eficientă pentru a evita risipa de memorie este utilizarea structurii de date circulare a cozii.

Ce este o coadă circulară?

O coadă circulară este similară cu o coadă liniară, deoarece se bazează și pe principiul FIFO (First In First Out), cu excepția faptului că ultima poziție este conectată la prima poziție dintr-o coadă circulară care formează un cerc. Este cunoscut și ca a Ring tampon .

Operațiuni pe coada circulară

Următoarele sunt operațiunile care pot fi efectuate pe o coadă circulară:

    Față:Este folosit pentru a obține elementul frontal din coadă.Spate:Este folosit pentru a obține elementul din spate din coadă.roQueue(valoare):Această funcție este folosită pentru a introduce noua valoare în coadă. Noul element este întotdeauna introdus din partea din spate.deQueue():Această funcție șterge un element din coadă. Ștergerea într-o coadă are loc întotdeauna de la front-end.

Aplicații ale cozii circulare

Coada circulară poate fi utilizată în următoarele scenarii:

buclă do și while în java
    Gestionarea memoriei:Coada circulară asigură gestionarea memoriei. După cum am văzut deja că în coada liniară, memoria nu este gestionată foarte eficient. Dar în cazul unei cozi circulare, memoria este gestionată eficient prin plasarea elementelor într-o locație nefolosită.Programare CPU:Sistemul de operare folosește și coada circulară pentru a introduce procesele și apoi a le executa.Sistemul de trafic:Într-un sistem de trafic de control computerizat, semaforul este unul dintre cele mai bune exemple de coadă circulară. Fiecare semafor se aprinde unul câte unul după fiecare interval de timp. Ca și cum lumina roșie se aprinde timp de un minut, apoi lumina galbenă timp de un minut și apoi lumina verde. După lumina verde, lumina roșie se aprinde.

Operație de coadă

Pașii funcționării în coadă sunt prezentați mai jos:

  • În primul rând, vom verifica dacă coada este plină sau nu.
  • Inițial, față și spate sunt setate la -1. Când introducem primul element într-o coadă, față și spate sunt setate la 0.
  • Când introducem un nou element, partea din spate devine incrementată, adică spate=spate+1 .

Scenarii pentru inserarea unui element

Există două scenarii în care coada nu este plină:

    Dacă spate != max - 1, apoi spate va fi incrementat la mod (maxsize) iar noua valoare va fi inserată la capătul din spate al cozii.Dacă față != 0 și spate = max - 1, înseamnă că coada nu este plină, apoi setați valoarea din spate la 0 și introduceți noul element acolo.

Există două cazuri în care elementul nu poate fi introdus:

  • Când fata ==0 && spate = max-1 , ceea ce înseamnă că partea din față este în prima poziție a cozii, iar spatele este în ultima poziție a cozii.
  • fata== spate + 1;

Algoritm pentru inserarea unui element într-o coadă circulară

Pasul 1: DACĂ (SPATE+1)%MAX = FAȚĂ
Scrieți „ OVERFLOW ”
Treceți la pasul 4
[Sfârșitul IF]

Pasul 2: DACĂ FAȚĂ = -1 și SPATE = -1
SET FATA = SPATE = 0
ALTE DACĂ SPATE = MAX - 1 și FAȚĂ ! = 0
SETARE SPATE = 0
ALTE
SET SPATE = (SPATE + 1) % MAX
[SFÂRȘITUL IF]

selectați mai multe table sql

Pasul 3: SET QUEUE[SPATE] = VAL

tipuri de testare

Pasul 4: IEȘIRE

Operație de scoatere din coadă

Pașii operației de scoatere din coadă sunt prezentați mai jos:

  • În primul rând, verificăm dacă coada este goală sau nu. Dacă coada este goală, nu putem efectua operația de scoatere din coadă.
  • Când elementul este șters, valoarea frontului este redusă cu 1.
  • Dacă mai rămâne un singur element care urmează să fie șters, atunci partea din față și din spate sunt resetate la -1.

Algoritm pentru ștergerea unui element din coada circulară

Pasul 1: DACĂ FRONT = -1
Scrieți „UNDERFLOW”
Treceți la Pasul 4
[Sfârșitul IF]

Pasul 2: SET VAL = QUEUE[FRONT]

Pasul 3: DACĂ FAȚĂ = SPATE
SET FATA = SPATE = -1
ALTE
DACĂ FAȚĂ = MAX -1
SET FRONT = 0
ALTE
SET FRANT = FRONT + 1
[Sfârșitul IF]
[SFÂRȘITUL IF]

formatează data în java

Pasul 4: IEȘIRE

Să înțelegem operația de așezare și scoatere din coadă prin reprezentarea schematică.

Coada circulară
Coada circulară
Coada circulară
Coada circulară
Coada circulară
Coada circulară
Coada circulară
Coada circulară

Implementarea cozii circulare folosind 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)>

Ieșire:

Coada circulară