Miksi pyöreän jonon käsite otettiin käyttöön?
Matriisin toteutuksessa oli yksi rajoitus
Kuten yllä olevasta kuvasta näemme, takaosa on jonon viimeisessä kohdassa ja etuosa osoittaa jonnekin 0:n sijaanthasema. Yllä olevassa taulukossa on vain kaksi elementtiä ja kolme muuta paikkaa ovat tyhjiä. Takaosa on jonon viimeisessä kohdassa; jos yritämme lisätä elementin, se näyttää, että jonossa ei ole tyhjiä tiloja. On olemassa yksi ratkaisu, jolla vältetään tällainen muistitilan tuhlaus siirtämällä molempia elementtejä vasemmalle ja säätämällä etu- ja takapäätä vastaavasti. Se ei ole käytännössä hyvä lähestymistapa, koska kaikkien elementtien siirtäminen vie paljon aikaa. Tehokas tapa välttää muistin tuhlausta on käyttää ympyränmuotoista jonotietorakennetta.
Mikä on pyöreä jono?
Pyöreä jono on samanlainen kuin lineaarinen jono, koska se perustuu myös FIFO (First In First Out) -periaatteeseen, paitsi että viimeinen paikka on yhdistetty ympyränmuotoisen jonon ensimmäiseen paikkaan. Se tunnetaan myös nimellä a Soittopuskuri .
Toiminnot pyöreässä jonossa
Seuraavat ovat toiminnot, jotka voidaan suorittaa pyöreässä jonossa:
Circular Queue -sovellukset
Pyöreää jonoa voidaan käyttää seuraavissa tilanteissa:
Jonotoiminto
Jonotoiminnan vaiheet on annettu alla:
- Ensin tarkistamme, onko jono täynnä vai ei.
- Aluksi etu- ja takaosa asetetaan arvoon -1. Kun lisäämme ensimmäisen elementin jonoon, sekä etu- että takaosa asetetaan arvoon 0.
- Kun lisäämme uuden elementin, takaosa kasvaa, ts. taka=taka+1 .
Skenaariot elementin lisäämiseksi
On olemassa kaksi skenaariota, joissa jono ei ole täynnä:
On kaksi tapausta, joissa elementtiä ei voi lisätä:
- Kun edessä ==0 && takana = max-1 , mikä tarkoittaa, että etu on jonon ensimmäisessä kohdassa ja takaosa jonon viimeisessä kohdassa.
- edessä== takana + 1;
Algoritmi elementin lisäämiseksi pyöreään jonoon
Vaihe 1: JOS (TAKA+1)%MAX = ETUSSA
Kirjoita 'OVERFLOW'
Siirry vaiheeseen 4
[JOS LOPPU]
Vaihe 2: JOS ETEEN = -1 ja TAKA = -1
SET ETEEN = TAKA = 0
MUUTA JOS TAKA = MAX - 1 ja ETEEN ! = 0
SET REAR = 0
MUU
SET REAR = (REAR + 1) % MAX
[JOS LOPPU]
Vaihe 3: SET QUEUE[REAR] = VAL
Vaihe 4: POISTU
Poista jonosta -toiminto
Jonosta poistamisen vaiheet on esitetty alla:
- Tarkistamme ensin, onko jono tyhjä vai ei. Jos jono on tyhjä, emme voi suorittaa poistotoimintoa.
- Kun elementti poistetaan, frontin arvoa pienennetään yhdellä.
- Jos jäljellä on vain yksi poistettava elementti, etu- ja takaosa palautetaan arvoon -1.
Algoritmi elementin poistamiseksi pyöreästä jonosta
Vaihe 1: JOS ETEEN = -1
Kirjoita 'ALIVUOTO'
Siirry vaiheeseen 4
[JOS LOPPU]
Vaihe 2: SET VAL = JONO[ETTU]
Vaihe 3: JOS ETEEN = TAKA
SET ETEEN = TAKA = -1
MUU
JOS ETEEN = MAX -1
SET FRONT = 0
MUU
SET FRONT = ETU + 1
[JOS LOPPU]
[JOS LOPPU]
Vaihe 4: POISTU
Ymmärretään jono- ja dequeue-toiminto kaaviomaisen esityksen kautta.
Pyöreän jonon toteutus Arraylla
#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)>
Lähtö:
preg_match
=rear)>