Sunteți pe pagina 1din 15

Tehnici de programare

Stiva

Ovidiu Bania, ovidiu.banias@aut.upt.ro

Cuprins
Stiva Forma polonez Calculul unei expresii matematice

Stiva

Stiva
Definiie: structur de date abstract, avnd prorietatea c operaiile de adugare i extragere se realizaz numai din vrful stivei. (LIFO Last In First Out)
POP

VF i+2 i+1 i PUSH

. . .

2 1 Stiva

Stiva(cont.)
Se folosesc vectori pt. simularea stivei St la baza recursivitii

Funcia Manna Pnueli

Funcia Ackermann
dac y = 0 x + 1 f ( x, y ) = ac( x 1,1) dac y = 0 ac( x 1, ac( x, y 1)) altfel

x 1, dac x 12 f ( x) = f ( f ( x + 2)), altfel

Stiva

Stiva(cont.). Manna Pnueli


Funia Manna Pnueli
f (12) = 11, f (13) = 12, f (14) = 13,... f (6) = f ( f (8)) = f ( f ( f (10))) = f ( f ( f ( f (12)))) = f ( f ( f (11))) = f ( f ( f ( f (13)))) = = f ( f ( f (12))) = f ( f (11)) = f ( f ( f (13))) = f ( f (12)) = f (11) = f ( f (13)) = f (12) = 11

x 1, dac x 12 f ( x) = f ( f ( x + 2)), altfel

Cum se implementeaz n C?
se folosete o structur de date de tip stiva st se adaug n stiv valoarea lui x pentru x<12, la apelul funiei f se pune(PUSH) n stiv rezultatul x+2 pentru x12, se scoate din stiv (POP) i se modific nou vrf al stivei cu x-1 algoritmul se ncheie cnd nu mai sunt elemente n stiv Stiva

Stiva(cont.). Manna Pnueli


Exemplu

f ( 6) = ?

11
Stiva

Stiva(cont.). Ackermann
Funia Ackermann
daca x = 0 y +1 f ( x , y ) = f ( x 1,1) daca y = 0 f ( x 1, f ( x , y 1)) altfel

f (2,1) = f (1, f (2,0)) = f (1, f (1,1)) = f (1, f (0, f (1,0))) = = f (1, f (0, f (0,1))) = f (1, f (0,2)) = f (1,3) = f (0, f (1,2)) = = f (0, f (0, f (1,1))) = f (0, f (0, f (0, f (1,0)))) = f (0, f (0, f (0, f (0,1)))) = f (0, f (0, f (0,2))) = f (0, f (0,3)) = f (0,4) = 5
se folosete o structur de date de tip stiva cu 2 elemente st se adaug n stiv valoarile x i y Pentru x i y 0, la apelul funiei f se pune n stiv (x,y-1) pentru y=0, se modific vrful stivei cu valorile (x-1,1) pentru x=0, se scoate din stiv (x,y) i se modific nou vrf al stivei cu (x-1,y) Stiva

Stiva(cont.). Ackermann
Exemplu

5
Stiva

Forma polonez postfixat


Definiie: FP postfixat este o notaie matematic prin care orice operator urmeaz operanzii si.
Fie E1 , E2 expr. aritmetice i @ un operator = {*, /,+,}.
FP

E1 @ E2 E1 E2 @

a + b forma normal ab + forma postfixat + ab forma prefixat

(a + b) * (c d ) forma normal ab + cd - * * + ab - cd forma postfixat forma prefixat

a * (b c) + d /(e + f * h) i forma normal abc-*defh* + /i- +


Stiva

forma postfixat

Forma polonez postfixat(cont.)


Problem: Se d o expresie aritmetic n form normal. S se afieze expresia n form polonez postfixat. Observaii:
se ine cont de ordinea efecturii operaiilor, vor fi setate prioriti pentru operatorii care nu pot fi folosii la un moment dat (datorit ordinii efecturii operaiilor), se va folosi stiva

Input: Output:

(a * (b c) + d /(e + f * h) i )

abc-*defh* + /i- +
Stiva

Forma polonez postfixat(cont.)


Rezolvare:
1. Se definesc prioritile operatorilor (,) prioritate 0 *,/ prioritate 1 +,- prioritate 2 2. Expresia matematic se citete caracter cu caracter i este de forma (E) 3. Operanzii se introduc n vectorul fp 4. Operatorii se introduc in stiva st, apoi se transfer n fp cu excepia (,) 5. n funcie de valoarea i prioritatea operatorului op din vrful stivei se fac urmtoarle operaii: dac (prioritate(op)==1), se scoate op din stiv i se adaug n fp (se transfer) dac (prioritate(op)==2), se scoate temporar operatorul op din vrful stivei, se transfer din stiv n fp toi operatorii cu prioritate 1, apoi se reintroduce in stiv operatorul op dac (op==)), se scot din stiv toi operatorii pn cnd (op==() i se adaug in fp. Cu siguran n acest moment, operatorii dintre paranteze vor avea aceeai prioritate!

Stiva

Forma polonez postfixat(cont.)


Exemplu: (a * (b c) + d /(e + f * h) i )

Stiva

Calculul unei expresii aritmetice


Problem: Se d o expresie aritmetic n form normal i valorile fiecrui operand al expresiei. S se calculeze rezultatul expresiei aritmetice. Observaie:
Pornind de la forma polonez postfixat se pot calcula uor subexpresii de forma:

ri = opi opi +1 @, unde @ = {*,/, + ,-}, i = 1,n 1


(a * (b + c))
Input:

a=2 b=3 c =1

Output:

Stiva

Calculul unei expresii aritmetice(cont.)


Rezolvare:
1. Se transform expresia aritmetic din form normal n form polonez postfixat 2. Se parcurge fp de la stnga la dreapta 3. Dac fp[k] este operand atunci se introduce n stiva st 4. Dac fp[k] este operator atunci se scot din stiva st ultimii doi operanzi i se introduce n stiv rezultatul expresiei

opi @ opi +1 , unde @ - operator; opi , opi +1 - operanzi

Stiva

Calculul unei expresii aritmetice(cont.)


Exemplu: Input:

(a * (b c) + d /(e + f * h) i ) a=2 b=3 d = 30 e = 6 h =1 i=6 c=3 f =4

( a * (b c) + d /(e + f * h) i ) abc-*defh* + /i- +

= 3
Stiva

S-ar putea să vă placă și