This shows you the differences between two versions of the page.
sd-ca:laboratoare:lab-05 [2020/03/19 17:04] teodor_adrian.mirea [Schelet] |
sd-ca:laboratoare:lab-05 [2024/03/31 21:07] (current) andrei.pirlea [Interviu] |
||
---|---|---|---|
Line 2: | Line 2: | ||
Responsabili: | Responsabili: | ||
- | * [[mailto:rares96cheseli@gmail.com|Rareș Cheșeli]] | + | * [[mailto:andreipirlea03@gmail.com|Andrei Pîrlea]] |
- | * [[mailto:amirea99@gmail.com|Adrian Mirea]] | + | * [[mailto:popaiarina13@gmail.com|Iarina-Ioana Popa]] |
Line 35: | Line 35: | ||
O stivă poate fi implementată cu ajutorul unui **vector** sau cu **liste înlănțuite**. | O stivă poate fi implementată cu ajutorul unui **vector** sau cu **liste înlănțuite**. | ||
- | În cadrul acestui laborator, ne vom concentra asupra implementării unei stive cu ajutorul unui vector de stocare. | + | În cadrul acestui laborator, ne vom concentra asupra implementării unei stive cu ajutorul unui liste înlănțuite. |
==== Reprezentare internă cu vector ==== | ==== Reprezentare internă cu vector ==== | ||
Line 128: | Line 128: | ||
EROARE: forma postfixată nu este corectă | EROARE: forma postfixată nu este corectă | ||
</code> | </code> | ||
+ | |||
+ | |||
+ | === Exemplu de utilizare in sistemele de operare === | ||
+ | |||
+ | Sistemele de operare folosesc conceptul de stiva pentru rularea oricarui program prin ceea ce se numeste call stack. | ||
+ | Acesta este un mecanism care tine evidenta functiilor care se executa la un moment de timp. Call stack-ul | ||
+ | va fi populat cu stack frame-uri, fiecare functie avand propriul frame ce se va distruge la terminarea executiei acesteia. | ||
+ | Fiecare frame va stoca mai multe informatii necesare rularii programului precum parametri primiti de functie, variabile locale | ||
+ | si adresa de return. | ||
+ | La fiecare apel de functie, inainte de a executa codul respectivei functii, procesorul salveaza pe stiva | ||
+ | adresa urmatoarei instructiuni de dupa acel apel, astfel incat, la terminarea functiei, sa poata relua executia din punctul corect. | ||
===== Coadă (Queue) ===== | ===== Coadă (Queue) ===== | ||
Line 171: | Line 182: | ||
* //int is_full(struct Queue *queue)// - se verifică dacă următorul index după **tail** (circular) este egal cu **head**. Dacă da, returnează //1//, returnează //0// în caz contrar. Complexitate: O(1) | * //int is_full(struct Queue *queue)// - se verifică dacă următorul index după **tail** (circular) este egal cu **head**. Dacă da, returnează //1//, returnează //0// în caz contrar. Complexitate: O(1) | ||
+ | |||
+ | === Exemplu de utilizare a unei cozi (circulare) === | ||
+ | |||
+ | Conceptul de CPU scheduling se refera la ordinea in care procesele noastre ruleaza. Deoarece avem mai multe procese decat core-uri, | ||
+ | trebuie sa stabilim un algoritm care ghideaza planificarea aceasta: cat timp unele vor rula, altele isi vor astepta randul. | ||
+ | Cel mai simplu mecanism de acest tip este folosirea este folosirea unei cozi (circulare), in care toate procesele sunt tratate cu | ||
+ | aceeasi prioritate si se executa in ordinea in care au fost introduse in coada. Spunem despre acest tip de algoritm ca este de tip | ||
+ | [[https://www.guru99.com/round-robin-scheduling-example.html|Round Robin]]. | ||
+ | |||
+ | Pasii sunt urmatorii: | ||
+ | Lansam un proces. El este adaugat in coada si primeste o cuanta de timp de nivelul ms (cat timp are voie sa ruleze). | ||
+ | Cand se elibereaza un loc pe procesor, se face dequeue, iar procesul scos din coada va rula. Daca isi consuma toata cuanta | ||
+ | de timp si inca nu si-a terminat toate instructiunile, este adaugat inapoi in coada, i se reseteaza cuanta si isi asteapta randul. | ||
+ | |||
===== Alte tipuri de coadă ===== | ===== Alte tipuri de coadă ===== | ||
Line 304: | Line 329: | ||
===== Schelet ===== | ===== Schelet ===== | ||
- | + | <note important> | |
- | {{:sd-ca:laboratoare:schelet_laborator05_stackqueue.zip|}} | + | Daca folositi **Github Classroom**, va rugam sa va actualizati scheletul cu cel de mai jos. Cel din repo-ul clonat initial nu este la cea mai recenta versiune. |
- | + | </note> | |
+ | {{:sd-ca:laboratoare:sda_lab5.zip|Scheletul de laborator}} | ||
===== Exerciţii ===== | ===== Exerciţii ===== | ||
<note> | <note> | ||
- | Fiecare laborator va avea unul sau doua exerciții publice si un pool de subiecte ascunse, din care asistentul poate alege cum se formeaza celelalte puncte ale laboratorului. | + | Trebuie să vă creați cont de [[https://lambdachecker.io | Lambda Checker]], dacă nu v-ați creat deja, pe care îl veți folosi la SD pe toată durata semestrului. Aveti grija sa selectati contestul corect la submit, si anume **[[https://beta.lambdachecker.io/contest/31 |SD-CA-LAB-04 Stiva si Coada]]** |
- | + | ||
- | Atenție! Pentru acest laborator asistentul poate înlocui exercițiile publice complet. | + | |
</note> | </note> | ||
- | 1) [**3p**] Implementați, plecând de la scheletul de cod, stiva. | + | 1) [**3p**] Implementați, plecând de la scheletul de cod, stiva. **Atenție!** În implementarea stivei se va folosi **lista simplu înlănțuită** detaliată în secțiunea de mai sus. (problema **Stack Implementation** pe LambdaChecker) |
- | 2) [**3p**] Implementați, plecând de la scheletul de cod, coada. | + | 2) [**3p**] Implementați, plecând de la scheletul de cod, coada. **Atenție!** Implementarea are la baza un **vector circular** despre care puteți citi mai multe în secțiunea de mai sus. (problema **Queue Implementation** pe LambdaChecker) |
- | 3) [**1p**] Determinați dacă un șir format din caracterele ''('', ''['', ''{'', '')'', '']'', ''}'' este corect parantezat. | + | 3) [**1p**] Rezolvati problema **Lucrări**. O veti gasi pe LambdaChecker in contestul Laborator 5 SD. |
+ | (**Bonus**) [**2p**] Implementați operațiile elementare ale unei stive folosind două cozi. Problema admite două versiuni: una în care operația pop este eficientă, iar cealaltă în care operația push este eficientă. (pentru a primi punctajul, implementați soluția local, apoi urcați codul pe GitHub) | ||
+ | |||
+ | <hidden> | ||
4) [**1p**] Verificați dacă un număr este palindrom folosind un deque. | 4) [**1p**] Verificați dacă un număr este palindrom folosind un deque. | ||
+ | </hidden> | ||
===== Interviu ===== | ===== Interviu ===== | ||
Line 340: | Line 366: | ||
- Cum s-ar implementa o stivă folosind o coadă de priorități? | - Cum s-ar implementa o stivă folosind o coadă de priorități? | ||
- De câte cozi este nevoie ca să se poată implementa o coadă de priorități? | - De câte cozi este nevoie ca să se poată implementa o coadă de priorități? | ||
+ | - Rezolvati problema Turnurilor din Hanoi. | ||
===== Bibliografie ===== | ===== Bibliografie ===== |