¿Por qué se introdujo el concepto de cola circular?
Había una limitación en la implementación de la matriz de
Como podemos ver en la imagen de arriba, la parte trasera está en la última posición de la cola y el frente apunta a algún lugar en lugar de 0.thposición. En la matriz anterior, sólo hay dos elementos y otras tres posiciones están vacías. La retaguardia está en la última posición de la cola; Si intentamos insertar el elemento, mostrará que no hay espacios vacíos en la cola. Existe una solución para evitar ese desperdicio de espacio en la memoria desplazando ambos elementos a la izquierda y ajustando la parte delantera y trasera en consecuencia. No es un enfoque prácticamente bueno porque cambiar todos los elementos consumirá mucho tiempo. El enfoque eficaz para evitar el desperdicio de memoria es utilizar la estructura de datos de cola circular.
¿Qué es una cola circular?
Una cola circular es similar a una cola lineal, ya que también se basa en el principio FIFO (primero en entrar, primero en salir), excepto que la última posición está conectada a la primera posición en una cola circular que forma un círculo. También se le conoce como Búfer de anillo .
Operaciones en cola circular
Las siguientes son las operaciones que se pueden realizar en una cola circular:
Aplicaciones de la cola circular
La cola circular se puede utilizar en los siguientes escenarios:
Operación de puesta en cola
Los pasos de la operación de puesta en cola se detallan a continuación:
- Primero, comprobaremos si la cola está llena o no.
- Inicialmente, la parte delantera y trasera están configuradas en -1. Cuando insertamos el primer elemento en una cola, tanto la parte delantera como la trasera se establecen en 0.
- Cuando insertamos un nuevo elemento, la parte trasera se incrementa, es decir, trasero=trasero+1 .
Escenarios para insertar un elemento
Hay dos escenarios en los que la cola no está llena:
Hay dos casos en los que el elemento no se puede insertar:
- Cuando frente ==0 && trasero = max-1 , lo que significa que el frente está en la primera posición de la cola y la parte trasera está en la última posición de la cola.
- delantero== trasero + 1;
Algoritmo para insertar un elemento en una cola circular
Paso 1: SI (TRASERO+1)%MAX = DELANTERO
Escribe 'DESBORDAMIENTO'
Ir al paso 4
[Fin DE SI]
Paso 2: SI DELANTERO = -1 y TRASERO = -1
AJUSTAR DELANTERO = TRASERO = 0
¡OTRO SI TRASERO = MAX - 1 y DELANTERO! = 0
ESTABLECER TRASERO = 0
DEMÁS
AJUSTAR TRASERO = (TRASERO + 1) % MAX
[FIN DE SI]
Paso 3: ESTABLECER COLA[TRASERO] = VAL
Etapa 4: SALIDA
Operación de salida de cola
Los pasos de la operación de eliminación de la cola se detallan a continuación:
- Primero, verificamos si la cola está vacía o no. Si la cola está vacía, no podemos realizar la operación de sacar de la cola.
- Cuando se elimina el elemento, el valor de front disminuye en 1.
- Si solo queda un elemento que desea eliminar, entonces la parte delantera y trasera se restablecen a -1.
Algoritmo para eliminar un elemento de la cola circular
escribe json en el archivo python
Paso 1: SI DELANTE = -1
Escribe 'FLUJO SUPERIOR'
Ir al paso 4
[FIN de SI]
Paso 2: ESTABLECER VAL = COLA[FRONTAL]
Paso 3: SI DELANTERO = TRASERO
AJUSTAR DELANTERO = TRASERO = -1
DEMÁS
SI DELANTERO = MAX -1
CONFIGURAR DELANTE = 0
DEMÁS
CONFIGURAR DELANTE = DELANTERO + 1
[FIN de SI]
[FIN DE SI]
Etapa 4: SALIDA
Comprendamos la operación de poner y quitar la cola a través de la representación esquemática.
Implementación de cola circular usando 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)>
Producción:
=rear)>