logo

Circulaire wachtrij

Waarom werd het concept van de circulaire wachtrij geïntroduceerd?

Er was één beperking bij de array-implementatie van

Zoals we in de bovenstaande afbeelding kunnen zien, bevindt de achterkant zich op de laatste positie van de wachtrij en wijst de voorkant ergens heen in plaats van naar de 0epositie. In de bovenstaande array zijn er slechts twee elementen en zijn de andere drie posities leeg. De achterkant bevindt zich op de laatste positie van de wachtrij; als we proberen het element in te voegen, zal het laten zien dat er geen lege spaties in de wachtrij zijn. Er is één oplossing om een ​​dergelijke verspilling van geheugenruimte te voorkomen door beide elementen aan de linkerkant te verschuiven en de voor- en achterkant dienovereenkomstig aan te passen. Het is praktisch gezien geen goede aanpak, omdat het verschuiven van alle elementen veel tijd zal kosten. De efficiënte aanpak om verspilling van geheugen te voorkomen is het gebruik van de datastructuur van de circulaire wachtrij.

data structuur

Wat is een circulaire wachtrij?

Een cirkelvormige wachtrij is vergelijkbaar met een lineaire wachtrij, omdat deze ook gebaseerd is op het FIFO-principe (First In First Out), behalve dat de laatste positie is verbonden met de eerste positie in een cirkelvormige wachtrij die een cirkel vormt. Het is ook bekend als een Ringbuffer .

Bewerkingen op circulaire wachtrij

Hieronder volgen de bewerkingen die kunnen worden uitgevoerd op een circulaire wachtrij:

    Voorkant:Het wordt gebruikt om het voorste element uit de wachtrij te halen.Achterkant:Het wordt gebruikt om het achterste element uit de wachtrij te halen.enQueue(waarde):Deze functie wordt gebruikt om de nieuwe waarde in de wachtrij in te voegen. Het nieuwe element wordt altijd vanaf de achterkant ingevoegd.deQueue():Deze functie verwijdert een element uit de wachtrij. Het verwijderen in een wachtrij vindt altijd plaats vanaf de voorkant.

Toepassingen van circulaire wachtrij

De circulaire wachtrij kan in de volgende scenario's worden gebruikt:

    Geheugen management:De circulaire wachtrij zorgt voor geheugenbeheer. Zoals we al hebben gezien, wordt het geheugen bij lineaire wachtrijen niet erg efficiënt beheerd. Maar in het geval van een circulaire wachtrij wordt het geheugen efficiënt beheerd door de elementen op een ongebruikte locatie te plaatsen.CPU-planning:Het besturingssysteem gebruikt ook de circulaire wachtrij om de processen in te voegen en vervolgens uit te voeren.Verkeerssysteem:In een computergestuurd verkeerssysteem is het verkeerslicht een van de beste voorbeelden van de cirkelvormige wachtrij. Elk verkeerslicht gaat na elk tijdsinterval één voor één AAN. Alsof het rode licht een minuut AAN gaat, dan het gele licht gedurende een minuut en dan het groene licht. Na groen licht gaat het rode licht AAN.

Wachtrij-operatie

De stappen voor het in de wachtrij plaatsen worden hieronder gegeven:

  • Eerst zullen we controleren of de wachtrij vol is of niet.
  • Aanvankelijk zijn de voor- en achterkant ingesteld op -1. Wanneer we het eerste element in een wachtrij invoegen, worden voor en achter beide op 0 gezet.
  • Wanneer we een nieuw element invoegen, wordt de achterkant verhoogd, d.w.z. achter=achter+1 .

Scenario's voor het invoegen van een element

Er zijn twee scenario's waarin de wachtrij niet vol is:

    Indien achter != max - 1, waarna de achterkant wordt verhoogd naar mod(maxgrootte) en de nieuwe waarde wordt aan de achterkant van de wachtrij ingevoegd.Als voor != 0 en achter = max - 1, betekent dit dat de wachtrij niet vol is. Stel vervolgens de waarde van achter in op 0 en voeg daar het nieuwe element in.

Er zijn twee gevallen waarin het element niet kan worden ingevoegd:

  • Wanneer voorkant ==0 && achter = max-1 , wat betekent dat de voorkant zich op de eerste positie van de wachtrij bevindt en de achterkant op de laatste positie van de wachtrij.
  • voor== achter + 1;

Algoritme om een ​​element in een cirkelvormige wachtrij in te voegen

Stap 1: ALS (ACHTER+1)%MAX = VOOR
Schrijf 'OVERLOOP'
Ga naar stap 4
[Einde VAN ALS]

Stap 2: ALS VOOR = -1 en ACHTER = -1
SET VOOR = ACHTER = 0
ANDERS ALS ACHTER = MAX - 1 en VOOR ! = 0
SET ACHTER = 0
ANDERS
SET ACHTER = (ACHTER + 1) % MAX
[EIND VAN ALS]

Stap 3: WACHTRIJ INSTELLEN[ACHTER] = WAARDE

Stap 4: UITGANG

Operatie uit de wachtrij

De stappen voor het uit de wachtrij halen worden hieronder gegeven:

  • Eerst controleren we of de wachtrij leeg is of niet. Als de wachtrij leeg is, kunnen we de dequeue-bewerking niet uitvoeren.
  • Wanneer het element wordt verwijderd, wordt de waarde van front met 1 verlaagd.
  • Als er nog maar één element over is dat moet worden verwijderd, worden de voor- en achterkant teruggezet op -1.

Algoritme om een ​​element uit de circulaire wachtrij te verwijderen

verbindingen in Java

Stap 1: INDIEN VOOR = -1
Schrijf 'ONDERSTROOM'
Ga naar stap 4
[EIND van ALS]

Stap 2: SET VAL = WACHTRIJ[VOOR]

javascript if-instructie

Stap 3: INDIEN VOOR = ACHTER
SET VOOR = ACHTER = -1
ANDERS
ALS VOOR = MAX -1
VOORZET = 0
ANDERS
SET VOOR = VOOR + 1
[EIND van ALS]
[EIND VAN ALS]

Stap 4: UITGANG

Laten we de bewerking van het in de wachtrij plaatsen en uit de wachtrij halen begrijpen via de schematische weergave.

Circulaire wachtrij
Circulaire wachtrij
Circulaire wachtrij
Circulaire wachtrij
Circulaire wachtrij
Circulaire wachtrij
Circulaire wachtrij
Circulaire wachtrij

Implementatie van een circulaire wachtrij met behulp van 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)>

Uitgang:

Circulaire wachtrij