Sunteți pe pagina 1din 2

Structuri de Date L A B O R A T O R 2a Evaluare expresii de relatie si logice folosind stive Pentru simplificare vom considera operatori de relatie si logici

de un singur caracter (ca in limbajul BASIC): <, > , = (egal), # (diferit), & (si), | (sau) Operanzii vor fi numai cifre zecimale. 1. Sa se scrie si sa se verifice functii pentru operatii cu o stiva vector de caractere : init, push, pop, empty, top. Pentru verificarea functiilor se va initializa stiva ("init"), se vor pune ("p ush") pe stiva intr-un ciclu 5 caractere consecutive, dupa care se vor citi ("top"), s e vor scoate din stiva ("pop") si se vor afisa intr-un alt ciclu repetat pana la golir ea stivei ("empty"). 2. Sa se scrie o functie pentru evaluarea unei expresii postfixate sub forma unui sir de caractere fara spatii albe : char eval (char* exp); Algoritm: repeta pana la terminarea sirului postfixat { extrage urmatorul caracter din sir daca este operand atunci pune caracter in stiva daca este operator atunci memoreaza operator in 'op' scoate din stiva in t2 scoate din stiva in t1 calcul expresie (t1 op t2) pune rezultat in stiva } scoate din stiva si transmite ca rezultat Exemple de expresii postfixate pentru verificarea functiei "eval": 53# 31>2| 73>41<& echiv cu 5#3 (= 1) echiv cu (3>1)| 2 (= 1) echiv cu (7>3)&(4<1) (= 0)

Se va scrie si folosi o functie pentru calculul valorii unei expresii cu doi operanzi intregi (operanzii si rezultatul sunt numere binare): int calc ( char op, char x, char y) 3. Sa se scrie o functie de trecere a unei expresii din forma infixata la forma postfixata: void postf (char* inf, char* ptf); // ptf=sir postfixat Expresia se da sub forma unui sir care contine numai operanzi de un singur caracter (cifre) si operatori binari de relatie (=,#,<,>), logici (|,&), plus

paranteze. Se considera expresii corecte sintactic, cu sau fara spatii albe. Trecerea unei expresii din forma normala la forma postfixata se face cu ajutorul unei stive de operatori si paranteze, dupa algoritmul urmator: repeta pana la terminarea sirului infixat { extrage urmatorul caracter din sir in ch daca ch este operand atunci trece ch in sirul postfixat daca ch este '(' atunci se pune ch in stiva daca ch este ')' atunci { repeta pana la '(' extrage din stiva si trece in sirul postfixat scoate '(' din stiva } daca ch este operator atunci { repeta cat timp prior(ch) <= prior (operator din varful stivei) scoate operatorul din stiva in sirul postfixat pune ch in stiva } } repeta cat timp stiva nu e goala scoate din stiva in sirul postfixat Exemple de expresii pentru verificarea functiei "postf": Forma infixata (3#5)|2 (7>3)&(4<1) (2=2)&0&(5>3) Forma postfixata 35#2| 73>41<& 22=0&53>&

Exemplu de functie pentru determinare prioritate operator: int pri (char op) { int k,nop=7; // numar de operatori char top[] = {'(','|','&','=','#','<','>'}; // tabel operatori int pr[] ={0,1,2,3,3,4,4}; // tabel de prioritati for (k=0;k<nop;k++) // cauta op in top if (op==top[k]) // daca e gasit return pr[k]; // prioritate operator op return -1; // daca op negasit } 4. Sa se reuneasca functiile anterioare intr-un singur program interpretor de expresii booleene cu operanzi constante intregi de o cifra. Programul citeste o expresie (cu "gets") si afiseaza rezultatul expresiei. Exemple: (7<3)|(3>1) (2=2)&0&(5>3) = 1 = 0

5. Sa se scrie o functie nerecursiva pentru evaluarea unei expresii prefixate , prin parcurgerea expresiei de la dreapta la stanga (folosind o stiva). Exemple de expresii pentru verificare: Infix (3#5)|0 (7>3)&(4<1) (2=2)&0&(5>3) ((2=2)|0)&(5>3) Prefix |#350 &>73<41 &&=220>53 &|=220>53 Rezultat 1 0 0 1