100din100

Ce este coada/queue si cum functioneaza? Tutorial clasa a 10-a

Publicat la 12 iulie 2020 · algoritmi olimpiada clasa 10 cpp


Ce este coada?

Coada (Queue din engleză) este o structură de date liniară care funcționează prin inserarea elementelor noi la spate şi prin eliminarea elementelor doar prin față. Altfel spus, adăugarea se face într-un capăt, iar eliminarea la celălalt capăt.

Cuprinsul lecției

Ce operații are coada?

Coada are mai multe operații, mai exact:

Observație

Imediat putem observa următorul lucru: primul element adăugat este şi primul care urmează să fie eliminat, deoarece ordinea de adăugare este identică cu cea de eliminare – astfel coada este o structură de tip FIFO – The First In is the First Out. Stiva, pe de altă parte, este LIFO, adică Last In First Out.


Un exemplu de coadă

Imaginați-vă un şir de persoane la casa de marcat. Prima persoană care a venit este şi prima persoană servită, iar persoanele care vin, pe rând, în spate, sunt servite în aceaşi ordine.



Cam aşa este şi coada. Putem să "prelucrăm" primul element (prima persoană), adică în exemplul nostru să îi scanăm produsele, după care acesta pleacă (îl scoatem din şir) şi vine următorul client (care devine "primul" din şir).


Un alt exemplu este atunci când suni la o pizzerie. Eşti plasat într-o coadă până când ți se ia comanda, iar în fața ta sunt cei care au comandat mai devreme decât tine.


Folosirea cozii - probleme tipice cu queue

Problemele tipice prelucrează datele într-o ordine exactă, existând posibilitatea ca, pe parcursul prelucrării, să mai adăugăm în coadă elemente noi. Cam aşa ar arăta schema unei astfel de probleme:


Implementarea cozii în programul tău

Vom prezenta două modalități de implementare a cozii. Fiecare are avantaje şi dezavantaje. Autorul o recomandă pe prima.


Implementarea statică

Implementarea statică se bazează pe un simplu vector, coada[] şi doi indici, st şi dr, unde st va reține indicele primului element al vectorului, iar dr va reține indicele ultimului element al vectorului. În următoarea secvența de cod am descris cele mai elementare aspecte de folosirea cozii:

#include <iostream>

using namespace std;

//de declarat la început.//pentru mai multe detalii: https://100din100.netlify.app
//dimensiunea maximă a cozii este de 1000, atenție la memorie!//pentru mai multe detalii: https://100din100.netlify.app
int coada[1000], st = 1, dr = 0; //declararea cozii şi a indicilor//pentru mai multe detalii: https://100din100.netlify.app

int lungime_coada() {
    //returnează lungimea cozii, cu clasica formulă de mate//pentru mai multe detalii: https://100din100.netlify.app
    return dr - st + 1;
}

int este_vida_coada() {
    //returnează 1 dacă coada este vidă,//pentru mai multe detalii: https://100din100.netlify.app
    //sau 0 în caz contrar//pentru mai multe detalii: https://100din100.netlify.app
    if(st <= dr) return 0; //lungimea este mai mare decât 0, aşadar nu este vidă coada.//pentru mai multe detalii: https://100din100.netlify.app
    else return 1; //lungimea este egală cu 0, aşadar coada este vidă.//pentru mai multe detalii: https://100din100.netlify.app
}

void initializare_coada() {
    //facem coada vidă prin setarea lungimii cozii = 0.//pentru mai multe detalii: https://100din100.netlify.app
    //astfel, lungime-coada() va returna 0 - 1 + 1 = 0.//pentru mai multe detalii: https://100din100.netlify.app
    st = 1;
    dr = 0;
}

void push_coada(int element) {
    //vom adăuga element la coadă//pentru mai multe detalii: https://100din100.netlify.app
    dr = dr + 1; //creşte lungimea cozii//pentru mai multe detalii: https://100din100.netlify.app
    coada[dr] = element; //noului element îi setăm valoarea dorită//pentru mai multe detalii: https://100din100.netlify.app
}

void pop_coada() {
    //eliminarea primului element al şirului,//pentru mai multe detalii: https://100din100.netlify.app
    //incrementând st.//pentru mai multe detalii: https://100din100.netlify.app
    st = st + 1;
}

int front_coada() {
    //returnează primul element, adică cel de pe poziția st//pentru mai multe detalii: https://100din100.netlify.app
    return coada[st];
}

int main()
{
    initializare_coada();
    cout<<lungime_coada()<<endl; //afişează 0//pentru mai multe detalii: https://100din100.netlify.app
    cout<<este_vida_coada()<<endl; //afişează 1//pentru mai multe detalii: https://100din100.netlify.app
    push_coada(1);
    push_coada(2);
    push_coada(3);
    cout<<lungime_coada()<<endl; //afişează 3//pentru mai multe detalii: https://100din100.netlify.app
    cout<<este_vida_coada()<<endl; //afişează 0//pentru mai multe detalii: https://100din100.netlify.app
    pop_coada(); //elimină 1//pentru mai multe detalii: https://100din100.netlify.app
    cout<<front_coada()<<endl; //afişează 2//pentru mai multe detalii: https://100din100.netlify.app
    push_coada(4);
    cout<<front_coada()<<endl; //afişează 2//pentru mai multe detalii: https://100din100.netlify.app
    return 0;
}

Avantaje. Operațiile sunt uşor de implementat şi sunt rapide.

Dezavantaje. Dacă se fac multe operații de pop, se risipă multă memorie (mereu s-ar putea economisi st memorie).


Implementarea cozii din STL

Implementarea cozii din STL are deja funcțiile predefinite şi se poate utiliza uşor, însă, poate fi mai greu de înțeles. Coada se află în biblioteca <queue>. Iată cum ar arăta noua coadă (aceleaşi exemple):

#include <iostream>
#include <queue>

using namespace std;

//de declarat la început.//pentru mai multe detalii: https://100din100.netlify.app
queue<int> coada; //declararea cozii. nu este nevoie de indici.//pentru mai multe detalii: https://100din100.netlify.app

int lungime_coada() {
    //returnează lungimea cozii, cu clasica formulă de mate//pentru mai multe detalii: https://100din100.netlify.app
    return coada.size();
}

int este_vida_coada() {
    //returnează 1 dacă coada este vidă,//pentru mai multe detalii: https://100din100.netlify.app
    //sau 0 în caz contrar.//pentru mai multe detalii: https://100din100.netlify.app
    //ne folosim de funcția deja scrisă.//pentru mai multe detalii: https://100din100.netlify.app
    if(coada.empty()) return 1;
    else return 0;
}

void initializare_coada() {
    //eliminăm toate elementele cozii. se poate şi cu swap//pentru mai multe detalii: https://100din100.netlify.app
    while(este_vida_coada() == 0) coada.pop();
}

void push_coada(int element) {
    //vom adăuga element la coadă//pentru mai multe detalii: https://100din100.netlify.app
    coada.push(element);
}

void pop_coada() {
    //eliminarea primului element al şirului.//pentru mai multe detalii: https://100din100.netlify.app
    coada.pop();
}

int front_coada() {
    //returnează primul element//pentru mai multe detalii: https://100din100.netlify.app
    return coada.front();
}

int main()
{
    initializare_coada();
    cout<<lungime_coada()<<endl; //afişează 0//pentru mai multe detalii: https://100din100.netlify.app
    cout<<este_vida_coada()<<endl; //afişează 1//pentru mai multe detalii: https://100din100.netlify.app
    push_coada(1);
    push_coada(2);
    push_coada(3);
    cout<<lungime_coada()<<endl; //afişează 3//pentru mai multe detalii: https://100din100.netlify.app
    cout<<este_vida_coada()<<endl; //afişează 0//pentru mai multe detalii: https://100din100.netlify.app
    pop_coada(); //elimină 1//pentru mai multe detalii: https://100din100.netlify.app
    cout<<front_coada()<<endl; //afişează 2//pentru mai multe detalii: https://100din100.netlify.app
    push_coada(4);
    cout<<front_coada()<<endl; //afişează 2//pentru mai multe detalii: https://100din100.netlify.app
    return 0;
}

Avantaje. Operațiile sunt deja scrise. Lungimea maximă a cozii nu este fixă.

Dezavantaje. Se consumă mai multă memorie pentru fiecare element în parte.



Test din coadă/queue

Completează următoarea secvență de cod:

int coada[100], st = 1, dr = 0;
...
//elimină primele două elemente ale cozii statice a:
+= 2;
· Vezi răspunsul

//pentru mai multe detalii: https://100din100.netlify.app

Răspunde la următoarea întrebare:

Funcția pentru a returna lungimea cozii este coada.();
· Vezi răspunsul

Alte resurse

GeeksForGeeks
Tutoriale-pe.net
PbInfo.ro

Alte articole

Primul tau program, variabile si operatii - TUTORIAL COMPLET C++

Eşti elev de liceu şi nu înțelegi informatica? Acest clip ar trebui să te ajute să înțelegi cele mai elementare aspecte privind informatica de liceu - algoritmica...

Rezolvări probleme PbInfo

Problemele de informatică pot fi dificile uneori, şi este util să vedem o soluție bună pentru a ne autoverifica. De multe ori sunt necesare doar nişte modificări minore, de aceea este bine să analizăm soluțiile bune cu atenție!

Video - Probleme Rezolvate PbInfo

Aici gasiti rezolvarea mai multor probleme de pe site-ul pbinfo.ro, în format video, pe canalul nostru de YouTube.

Ciurul lui eratostene - generarea numerelor prime - olimpiada C++

Să zicem că vrem să aflăm dacă mai multe numere sunt sau nu prime. Desigur, putem aplica algoritmul de aflare a numărului de divizori pentru toate numerele, doar că dacă avem foarte multe şi sun…

Ce este coada/queue si cum functioneaza? Tutorial clasa a 10-a

Ce este coada? Coada (Queue din engleză) este o structură de date liniară care funcționează prin inserarea elementelor noi la spate şi prin eliminarea elementelor doar prin față. Altfel spu…

Parcurgerea matricei in spirala in C++

Cu ce ne ajută parcurgerea matricei pătratice în spirală? În concursuri şi olimpiade apar probleme legate de parcurgerea matricei în spirală. Deşi ideea de bază este destul de uşoară, algor…

Cautarea binara pentru olimpiada in C++

Ce este căutarea binară? Să zicem că ai un vector a[] cu n elemente crescătoare. Căutarea binară este un algoritm eficient care determină dacă orice număr x apare sau n…

Afişare cu 2 zecimale exacte, fără şi cu rotunjire - TUTORIAL C++

Tutorialul acesta te învață cum să afişezi un număr real cu mai multe zecimale exacte. Multe probleme cer...

Algoritmi elementari - video

Tutoriale uşor de urmărit, sub forma unor videoclipuri!

Citirea si Afisarea in fisiere in C++ - Tutorial Incepatori

De ce citirea din fişier? De multe ori este necesară citirea şi afişarea în fişier, unul din motive fiind faptul că nu trebuie să reintroducem datele de intrare de fiecare dată când rulăm p…

Primul program - Operatori si expresii - Tutorial incepatori C++

Alcătuirea unui program pentru rezolvarea unei probleme se rezumă defapt la rezolvarea unor probleme mai mici. Spre exemplu, pentru a afla suma numerelor prime dintr-un şir, trebuie să ştim cum …

Sume partiale. Suma elementelor dintr-o submatrice in C++

Cu ce ne ajută sumele parțiale? Unele probleme cer aflarea sumei elementelor unei secvențe dintr-un şir dat. Metoda naivă, care face suma tuturor elementelor din secvența cerută, deobicei n…

Divizorii unui numar - tutorial incepatori in C++

Prezentul articol te va ajuta să îndeplineşti diferite aplicații cu divizorii unui număr. Trebuie cunoscută parcurgerea divizorilor unui număr, înainte de toate, ca să ne asigurăm că ştim s…

Tipuri de date in C++ si C - Tutorial Incepatori

De ce avem nevoie de date? În timp ce lucrăm cu valori, avem nevoie (uneori chiar suntem siliți!) să memorăm datele undeva, în memorie. Prin intermediul variabilelor putem accesa o zonă de …

Creeaza un joc 2D in PYTHON pentru incepatori - Capitolul 0 (Instalare)

Care-i faza? În aceste câteva tutoriale vom învăța cum să îți creezi propriul joc video în Python. Puteți viziona atât pe YouTube, cât şi în format text pe site-ul nostru (aici adică). …

Al doilea cel mai mic/mare element al unui sir in C++

Dându-se un şir de numere naturale distincte, aflați al doilea cel mai mic număr din şir. Exemplu:Intrare 9 5 8 2 4 Ieşire 4 Explicație4 este al doilea cel mai mi…

Prelucrarea cifrelor unui numar pentru incepatori in C++

Acest articol urmăreşte aplicarea diferitelor aplicații cu cifrele unui număr: suma cifrelor, numărul de cifre, oglinditul unui număr ş.a.m.d. Puteți găsi multe probleme care cer prelucrarea cif…

Sortarea vectorilor si a structurilor (pentru incepatori) in C++

Sortarea în informatică reprezintă procesul de a ordona un şir de obiecte (numere, caractere, sau chiar şiruri) după un anumit criteriu. Spre exemplu, putem ordona crescător sau descrescăto…

Verifica daca un an este bisect in C++

Dându-se un an, trebuie verificat dacă este un an bisect sau nu. Exemplu:Intrare 2021 Ieşire NU Definiția anului bisect Deşi pare evident, anii bis…

Tablelul ASCII - clasa a X-a - char C++

Ce este tabelul ASCII? Calculatorul reține numere (valori de 1 şi de 0), aşadar a fost nevoie de o corespondență între numere şi caractere pentru a putea reprezenta litere, si…

Smenul lui Mars (Difference Arrays) in C++

Ce este Şmenul lui Mars? Să zicem că avem un şir a[] cu n elemente. Unele probleme cer efectuarea unor operații de tipul sum(st, dr, val), cu semnificația că adunăm la …

Verifica daca o data este valida in C++

Dându-se o dată (zi lună an), trebuie verificat dacă data este validă sau nu. Exemplu:Intrare zi = 3, luna = 4, an = 2021 Ieşire DA Pentru a verifica da…

Vectori caracteristici si vectori de frecventa - Materie Olimpiada Informatica C++

Ce este un vector de frecvență sau un vector caracteristic? Vectorii caracteristici rețin dacă un element se află într-un vector sau nu. Similar, vectorii de frecvență rețin numărul de apar…

Ridicarea la putere in timp logaritmic pentru olimpiada in C++

Un număr de forma b la puterea e nu poate fi calculat precum celelalte operații (adunarea, scăderea, înmulțirea, împărțirea) pur şi simplu. În articolul acesta vom prezenta un mod foarte …

Învață să programezi gratis!

Am lansat InfoAs, o platformă de informatică cu sute de probleme, lecții și concursuri, totul gratuit. Încearcă acum!