This shows you the differences between two versions of the page.
|
sda-aa:laboratoare:05 [2021/03/28 22:20] cristian.rusu [3. Arbori binari] |
sda-aa:laboratoare:05 [2021/03/29 12:00] (current) cristian.rusu |
||
|---|---|---|---|
| Line 162: | Line 162: | ||
| <note important>Nodurile frunză nu au descendenți:nodul stâng și nodul drept pointează la NULL și nu trebuie adăugate în coadă.</note> | <note important>Nodurile frunză nu au descendenți:nodul stâng și nodul drept pointează la NULL și nu trebuie adăugate în coadă.</note> | ||
| + | |||
| + | |||
| + | ==== 4. Exerciții ==== | ||
| + | |||
| + | Scrieți un program care folosește arbori pentru a evalua expresii matematice cu cifre. | ||
| + | |||
| + | Să considerăm o expresie matematică: 2+4*5+1*2*3. | ||
| + | |||
| + | Pentru a crea un arbore de parsare avem nevoie să folosim următoarele structuri: | ||
| + | * stivă rezultat - folosită pentru a reține operanzii si rezultatele intermediare ale operațiilor parcurse până la un moment dat | ||
| + | * stivă de operatori - folosit pentru a reține operatorii | ||
| + | |||
| + | <code> | ||
| + | + | ||
| + | / \ | ||
| + | 2 + | ||
| + | / \ | ||
| + | * * | ||
| + | / \ / \ | ||
| + | 4 5 1 * | ||
| + | / \ | ||
| + | 2 3 | ||
| + | </code> | ||
| + | |||
| + | Algoritmul presupune: | ||
| + | * Se parcurge expresia,termen cu termen (un termen poate fi operator sau operand) | ||
| + | * Dacă termenul curent este operand aceasta se adaugă in stivă rezultat și se trece la termenul urmator | ||
| + | * Daca termenul curent este operator (!) | ||
| + | * Daca stiva operatorilor este vidă,se adaugă operatorul in stiva de operatori și se trece la termenul urmator | ||
| + | * Dacă stiva nu este vidă: | ||
| + | * Și operatorul curent are prioritate mai mare decât capul stivei (ex: crt este *,top(stivă) este +) se adaugă operatorul în stivă și se trece la termenul următor | ||
| + | * Și operatorul curent are prioritate mai mică decât capul stivei (ex: crt este +,top(stivă) este *) | ||
| + | * Se scot din stivă rezultatele ultimelor două rezultate | ||
| + | * Se scoate un operator din stiva operatorilor | ||
| + | * Se creează un nou rezultat intermediar,aplicând operatorul extras pe cele două rezultate de mai sus | ||
| + | * Acest rezultat intermediar se adaugă în stiva de rezultate | ||
| + | * Se verifică condițiile de la ! (se compară din nou același operator curent cu operatorul din vârful stivei). | ||
| + | |||
| + | Construiți arborele asociat expresiei. | ||
| + | |||
| + | {{:sda-aa:laboratoare:ast_stiva.jpg?800|}} | ||