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ă:
Aplicații ale cozii circulare
Coada circulară poate fi utilizată în următoarele scenarii:
buclă do și while în java
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ă:
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ă.
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 :'); 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->data=x; newnode->next=0; if(rear==-1) // checking whether the Queue is empty or not. { front=rear=newnode; rear->next=front; } else { rear->next=newnode; rear=newnode; rear->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)&&(rear==-1)) // checking whether the queue is empty or not { printf(' Queue is empty'); } else if(front==rear) // checking whether the single element is left in the queue { front=rear=-1; free(temp); } else { front=front->next; rear->next=front; free(temp); } } // function to get the front of the queue int peek() { if((front==-1) &&(rear==-1)) { printf(' Queue is empty'); } else { printf(' The front element is %d', front->data); } } // function to display all the elements of the queue void display() { struct node *temp; temp=front; printf(' The elements in a Queue are : '); if((front==-1) && (rear==-1)) { printf('Queue is empty'); } else { while(temp->next!=front) { printf('%d,', temp->data); temp=temp->next; } printf('%d', temp->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:
=rear)>