logo

Žiedinė eilė

Kodėl buvo pristatyta žiedinės eilės koncepcija?

Masyvo įgyvendinimui buvo vienas apribojimas

Kaip matome aukščiau esančiame paveikslėlyje, galinė dalis yra paskutinėje eilės padėtyje, o priekis yra nukreiptas kažkur, o ne 0thpadėtis. Aukščiau pateiktame masyve yra tik du elementai, o kitos trys pozicijos yra tuščios. Užpakalinė dalis yra paskutinėje eilės vietoje; jei bandysime įterpti elementą, tai parodys, kad eilėje nėra tuščių tarpų. Yra vienas sprendimas, kaip išvengti tokio atminties vietos švaistymo, perkeliant abu elementus į kairę ir atitinkamai sureguliuojant priekinę ir galinę dalį. Tai nėra praktiškai geras būdas, nes visų elementų perkėlimas atims daug laiko. Veiksmingas būdas išvengti atminties švaistymo yra naudoti apskritos eilės duomenų struktūrą.

Kas yra žiedinė eilė?

Apskritoji eilė yra panaši į linijinę eilę, nes ji taip pat pagrįsta FIFO (pirmas į pirmą išėjimą) principu, išskyrus tai, kad paskutinė padėtis yra sujungta su pirmąja apskritimo eilės padėtimi. Jis taip pat žinomas kaip a Žiedo buferis .

java generuoja atsitiktinį skaičių

Operacijos žiedinėje eilėje

Toliau pateikiamos operacijos, kurias galima atlikti apskritoje eilėje:

    Priekyje:Jis naudojamas priekiniam elementui gauti iš eilės.Galinis:Jis naudojamas norint gauti galinį elementą iš eilės.enQueue(reikšmė):Ši funkcija naudojama naujai reikšmei įterpti į eilę. Naujas elementas visada įterpiamas iš galinės dalies.dequeue ():Ši funkcija ištrina elementą iš eilės. Ištrynimas eilėje visada atliekamas iš priekio.

Circular Queue programos

Apvalią eilę galima naudoti šiais atvejais:

    Atminties valdymas:Apvali eilė užtikrina atminties valdymą. Kaip jau matėme, linijinėje eilėje atmintis valdoma ne itin efektyviai. Tačiau apskritos eilės atveju atmintis yra efektyviai valdoma dedant elementus į nenaudojamą vietą.CPU planavimas:Operacinė sistema taip pat naudoja apskritą eilę procesams įterpti ir tada juos vykdyti.Eismo sistema:Kompiuteriu valdomoje eismo sistemoje šviesoforas yra vienas geriausių žiedinės eilės pavyzdžių. Kiekviena šviesoforo lemputė užsidega po vieną po kiekvieno laiko intervalo. Kaip raudona lemputė dega vieną minutę, tada geltona šviesa vieną minutę, o tada žalia šviesa. Užsidegus žaliai, užsidega raudona lemputė.

Eilės operacija

Toliau pateikiami eilės operacijos žingsniai:

  • Pirmiausia patikrinsime, ar eilė pilna, ar ne.
  • Iš pradžių priekyje ir gale nustatomi -1. Kai į eilę įterpiame pirmąjį elementą, priekyje ir gale nustatomi 0.
  • Kai įterpiame naują elementą, galinė dalis didėja, t.y. galinis = galinis + 1 .

Elemento įterpimo scenarijai

Yra du scenarijai, kai eilė nėra pilna:

    Jei gale ! = maks - 1, tada galinis bus padidintas iki mod (maksimalus dydis) ir nauja reikšmė bus įterpta eilės gale.Jei priekyje = 0, o gale = max - 1, tai reiškia, kad eilė nepilna, tada nustatykite užpakalinės dalies reikšmę į 0 ir įterpkite ten naują elementą.

Yra du atvejai, kai elemento įterpti negalima:

  • Kada priekis ==0 && gale = max-1 , o tai reiškia, kad priekis yra pirmoje eilės pozicijoje, o galas yra paskutinėje eilės pozicijoje.
  • priekis== galinis + 1;

Algoritmas įterpti elementą į apskritą eilę

1 žingsnis: JEI (GALINIS+1)%MAX = PRIEKIS
Parašyk 'OVERFLOW'
Eikite į 4 veiksmą
[JEI PABAIGA]

2 žingsnis: JEI PRIEKIS = -1 ir GALINĖ = -1
NUSTATYTI PRIEKINĮ = GALINĖ = 0
KITAIP, JEI GALINĖ = MAX - 1 ir PRIEKIS! = 0
NUSTATYTI GALINĮ = 0
KITAS
NUSTATYTI GALINĮ = (GALINĖ + 1) % MAX
[JEI PABAIGA]

3 veiksmas: NUSTATYTI EILĘ[GALINĖ] = VAL

4 veiksmas: IŠĖJIMAS

c++ int į eilutę

Ištraukimo iš eilės operacija

Toliau pateikiami ištraukimo iš eilės veiksmai:

  • Pirmiausia patikriname, ar eilė tuščia, ar ne. Jei eilė tuščia, negalime atlikti ištraukimo iš eilės operacijos.
  • Kai elementas ištrintas, fronto reikšmė sumažinama 1.
  • Jei liko tik vienas elementas, kurį reikia ištrinti, tada priekyje ir gale nustatomi -1.

Algoritmas elementui ištrinti iš apskritos eilės

1 žingsnis: JEI PRIEKIS = -1
Parašykite 'UNDERFLOW'
Eikite į 4 veiksmą
[IF END]

2 žingsnis: NUSTATYTI VAL = EILĖ[PRIEKIS]

3 veiksmas: JEI PRIEKIS = GALIS
NUSTATYTI PRIEKINĮ = GALINĖ = -1
KITAS
JEI PRIEKIS = MAX -1
NUSTATYTI PRIEKINĮ = 0
KITAS
SET FRONT = PRIEKIS + 1
[IF END]
[JEI PABAIGA]

mysql unikalus raktas

4 veiksmas: IŠĖJIMAS

Supraskime eilės ir eilės pašalinimo operaciją per diagramą.

Žiedinė eilė
Žiedinė eilė
Žiedinė eilė
Žiedinė eilė
Žiedinė eilė
Žiedinė eilė
Žiedinė eilė
Žiedinė eilė

Apvalios eilės įgyvendinimas naudojant 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)>

Išvestis:

Žiedinė eilė