Sunteți pe pagina 1din 12

Cap.

5 ARBORI CU RDCIN
1. Definirea arborilor cu rdcin
Definiie: Se numete arbore un graf conex i fr cicluri.
n continuare se vor lua n discuie arborii cu rdcin. n cazul arborilor cu rdcin se pune n eviden un
vrf special al su numit rdcin. Alegerea rdcinii duce la aezarea arborelui pe nivele astfel:
se aeaz rcina pe nivelul 1 !acest nivel se noteaz n multe lucrri de specialitate cu "#
pe fiecare nivel k !k>1# se plaseaz acele vrfuri pentru care lungimea lanurilor care le leag de rdcin
este k1
se traseaz muc$iile arborelui
%utem da i o definiie recursiv a unui arbore cu rdcin: Se numete arborescen un arbore care are un vrf
special numit rdcin iar celelalte noduri pot fi repartizate n m mulimi dis&uncte !1" !#"$."!%" %&' astfel nct n
fiecare din aceste mulimi exist un nod adiacent cu rdcina' iar subgrafurile generate de acestea sunt la rndul
lor arborescene.
n particular' o arborescen cu un singur nod este format doar din nodul rdcin. (ac ordinea relativ a
arborescenelor generate de mulimile !1" !#"$."!% din definie are importan' arborescena se numete arbore
ordona'.
n reprezentarea grafic a unei arborescene nodurile se deseneaz pe nivele' astfel: rdcina se afl pe primul
nivel' vrfurile adiacente cu rdcina pe urmtorul nivel' etc.
)odurile adiacente cu rdcina se numesc de(cendenii rdcinii. *onceptul se aplic analog pentru nodurile de
pe un alt nivel. (escendenii aceluiai nod se numesc frai. (ac nodul ) este descendentul unui nod *' l numim
pe acesta din urm prin'ele nodului ).

4
7
10 5
11
2 3 1
6
8 9
12
nivelul 1
nivelul 2
nivelul 3
nivelul 4
Se numete +nli%ea unui arbore diferena dintre nivelul maxim din arbore i nivelul minim !nivelul rdcinii#.
%entru arborele de mai sus' nlimea este +,-..
Ob(er,aie: ntrun arbore orice nod este legat de rdcin printrun lan unic de lungime minim !corespunztor
parcurgerii B- de la grafuri#.
#. Repre.en'area arborilor oarecare
)odurile unui arbore oarecare pot fi reprezentate sub forma unei zone de memorie alocat dinamic sau sub
forma unui tablou de date alocate static. /ie urmtorul arbore:
1
Repre.en'area unui arbore oarecare se poate face astfel:
a# /crierea paran'e.a': /iind dat un arbore cu vrfurile etic$etate !numere sau caractere#' definim scrierea
lui parantezat ca fiind scrierea parantezat a rdcinii sale. 0a const n scrierea etic$etei ataat nodului
urmat' numai dac are descendeni' de scrierea parantezat a descendenilor cuprins ntre paranteze.
%entru arborele de mai sus' scrierea parantezat este:
4(11(5,10),7,8(2,3,1(6)),9(12))
b# %entru un nod oarecare putem folosi urmtoarea reprezentare cu informaiile alocate dinamic:
informaia
adresa primului descendent !fiu# stng
adresa primului frate drept
Aceast structur poate fi reprezentat astfel:
typedef struct nod{
int inf;
nod *fiu_stan, *frate_drept;
}!"#$"%;
c# %entru fiecare nod se poate stoca:
informaia
numrul de descendeni
adresa fiecrui descendent
1mplementarea poate fi fcut astfel:
typedef struct nod{
int inf;
int nr; //numrul descendenilor
nod *fiu&'"_(!)*(_+**,; //tablou cu adresele descendenilor
}!"#$"%;
0. 1arcur2erea arborilor oarecare
%rin parcur2ere se nelege
vizitarea n mod sistematic a nodurilor arborelui n
scopul prelucrrii informaiei ataate nodurilor sau
a liniarizrii nodurilor.
2om exemplifica metodele de parcurgere
pe urmtorul arbore:
3n arbore oarecare poate fi parcurs astfel:
a# n preordine: se viziteaz rdcina i
apoi descendenii direci ai fiecrui nod de
la stnga la dreapta
%entru arborele de mai sus' succesiunea preordine a nodurilor este:
2
4,11,5,10,7,8,2,3,1,6,9,12
b# n po('ordine: se parcurg de la stnga la dreapta descendenii direci ai fiecrui nod i apoi se viziteaz
rdcina
%entru arborele de mai sus' succesiunea postordine a nodurilor este:
5,10,11,7,2,3,6,1,8,12,9,4
c# pe ni,ele: se parcurg n ordine nodurile de pe fiecare nivel de la stnga la dreapta' ncepnd de la primul
nivel la ultimul nivel:
%entru arborele de mai sus' succesiunea postordine a nodurilor este:
4,11,7,8,9,5,10,2,3,1,12,6
(up cum se observ definirea celor trei moduri de parcurgere este recursiv.
%entru parcurgerea n preordine procedm astfel: se viziteaz nodul rdcin i se apeleaz recursiv
funcia de parcurgere pentru fiecare descendent' de la stnga la dreapta.
%entru parcurgerea n po('ordine se apeleaz recursiv funcia pentru parcurgerea tuturor descendenilor
i apoi se va afia informaia nodului rdcin.
%entru parcurgerea pe ni,ele !orizontal# se utilizeaz o parcurgere de tip coad pentru c este o
parcurgere B- !n lime#. *t timp coada nu este vid se extrage nodul curent din coad i se adaug la captul
opus al cozii toi descendenii nodului.
%rogramul urmtor gestioneaz un arbore oarecare reprezentat prin metoda a treia descris n seciunea
anterioar: pentru fiecare nod se precizeaz informaia ataat' numrul de descendeni i tabloul cu adresele
acestor descendeni. %rogramul ilustreaz modul de creare a unui astfel de arbore' cele trei metode de
parcur2ere descrise precum i 3'er2erea din memorie a arborelui creat. %entru tergere se va proceda astfel: se
terg mai nti toi descendenii unui nod' dup care se terge nodul tat. 3ltimul nod ters va fi rdcina arborelui.
-inc.ude/iostrea01
usin na0espace std;
-define '(!) 30 //numarul maxim de descendenti ai unui nod
typedef struct nod2
int inf;
int n; //numarul de descendenti
nod *.e&'(!),; //tabloul adreselor descendentilor
3!"#;
!"# *coada&100,; //coada pentru parcurgerea pe nivele
int pri0,u.ti0; //pentru gestionarea cozii
!"#* 4reare() //creaza arborele oarecare si returneaza adresa radacinii
2
int info,nr,i; !"# *p;
cout//5infor0atia nodu.ui6 5; cin11info;
p7ne8 !"#; p91inf7info;
cout//5nu0aru. descendenti.or pentru 5//info//56 5;
cin11nr; p91n7nr;
//se descriu in ordine descendentii de la stanga la dreapta si in adancime
for(i70;i/p91n;i::) p91.e&i,74reare();
//apelez recursiv functia pentru crearea descendentilor
return p; //radacina arborelui
3
;oid <reordine(!"# *p) //afiseaza nodurile in preordine
2
int i;
if(p)
2
cout//p91inf//5 5; //afisez nodul tata
for(i70;i/p91n;i::) <reordine(p91.e&i,); //afisez descendentii
3
3
;oid <ostordine(!"# *p) //afiseaza nodurile in postordine
2
int i;
if(p)
2
for(i70;i/p91n;i::)
if(p91.e&i,) <ostordine(p91.e&i,); //afisez descendentii
3
cout//p91inf//5 5; //afisez nodul tata
3
3
;oid !daua(!"# *p) //adauga un nod in coada
2
if(pri01u.ti0) cout//54oada este p.ina=n5;
e.se coada&u.ti0::,7p;
3
!"#* %>trae_nod() //extrage un nod din coada
2
if(pri077u.ti0) return 0;
e.se return coada&pri0::,;
3
;oid ?ra;ersare_ni;e.e(!"# *rad)
2
!"# *p; int i;
pri07u.ti070;
!daua(rad); //in coada se introduce nodul radacina
do2
p7%>trae_nod(); //extrag un nod din coada
if(p)
2
cout//p91inf//5 5; //afisez informatia nodului
for(i70;i/p91n;i::)
!daua(p91.e&i,); //adaug in coada descendentii nodului
3
38@i.e(p);
cout//5=n5;
3
;oid Atere(!"# *p) //stergerea unui nod din arbore
2
int i;
if(p)
for(i70;i/p91n;i::) Atere(p91.e&i,);
//mai intai sterg descendentii nodului
de.ete p; //sterg nodul tata
3
int 0ain()
2
!"# *rad; //radacina arborelui oarecare
cout//5=n=t=t*ntroduceti arBore.e6=n5;
rad74reare(); CCarBore.e a fost creat
cout//5=n=t=t?ra;ersarea in preordine6=n5;
<reordine(rad);
cout//5=n=t=t?ra;ersarea in postordine6=n5;
<ostordine(rad);
cout//5=n=t=t?ra;ersarea pe ni;e.e6=n5;
?ra;ersare_ni;e.e(rad);
Atere(rad); //stergerea arborelui din heap
return 0;
3
4. Definirea arborilor binari
Definiie: 3n arbore binar este o mulime finit de noduri care este fie vid' fie reprezint un arbore ordonat n
care fiecare nod are cel mult doi descendeni.
3n arbore binar conine cel mult doi subarbori' pe care i numim (ubarbore ('5n2' respectiv (ubarbore
drep'. 0i se pot obine prin suprimarea rdcinii i a nodurilor incidente cu aceasta. 3n nod fr descendeni se
numete nod 'er%inal sau frun..
4
3n arbore binar n care fiecare nod are " sau 4 descendeni se numete arbore binar co%ple'. 3n astfel de
arbore apare n figura de mai &os.
1roprie'i ale arborilor binari
,. 3n arbore binar complet care are n noduri terminale' toate situate pe acelai nivel' are n total #n1 noduri.
n consecin' un arbore binar complet are un numr impar de noduri.
4. )umrul maxim de noduri de pe nivelul i al unui arbore este #
i
.
.. )umrul maxim de noduri dintrun arbore binar cu nlimea 6 este #
671
1.
+. 3n arbore binar cu n noduri are nlimea mai mare sau egal cu 8lo2#n9.
5. Repre.en'area ('a'ic a arborilor binari
0xist mai multe posibiliti de repre.en'are a arborilor binari. n continuare sunt descrise trei metode de
reprezentare static a arborilor binari. 2om considera pentru exemplificare urmtorul arbore binar:
a# Repre.en'area ('andard se bazeaz pe urmtorul
principiu: pentru fiecare nod n parte se precizeaz' dac exist'
descendentul stng i descendentul drept. (ac un nod este terminal'
atunci acest lucru se precizeaz punnd " n locul descendenilor si.
%entru aceast se utilizeaz fie doi vectori numii' de exemplu' /pentru
descendenii din stnga i Dpentru descendenii din dreapta. (ac
pentru reprezentarea unui arbore binar cu n noduri se folosesc vectorii
/ i D' atunci pentru fiecare nod i{1"#"....n} componenta /8i9 conine
descendentul stng al nodului i' iar componenta D8i9 conine
descendentul drept al nodului i.
(e exemplu' pentru arborele binar de mai sus' cei doi vectori vor
avea urmtoarea structur:

Se observ c nu este important s se precizeze rdcina' deoarece ea nu este descendenta nici unui nod.
b# :e2'uri de 'ip 'a'. Se folosesc doi vectori: ;A;A i D</C. %entru fiecare nod i' ;A;A8i9 precizeaz
care nod i este ascendent !nodul printe#. D</C8i9 poate lua dou valori: 1 dac i este descendent stng pentru
;A;A8i9 i 1 dac este descendent drept pentru acesta. %entru nodul rdcin' care nu are un nod printe asociat'
Nodul i 1 # 0 4 5 = > ? @
/8i9 # 4 & & = & ? & &
D8i9 0 5 & & > & @ & &
5
valoarea corespunztoare n cei doi vectori este ". %entru arborele binar de mai sus' configuraia celor doi vectori
este:
c# Repre.en'area cu paran'e.e Aparan'e.a'#. %entru a obine o reprezentare a arborelui folosind
paranteze' se procedeaz n felul urmtor:
,# se scrie nodul rdcin
4# fiecare nod al arborelui va fi urmat de:
o parantez rotund desc$is
o descendent stng
o virgul
o descendent drept
o parantez rotund nc$is
%entru arborele din figura anterioar' reprezentarea parantezat este: 1A # A4 " 5 A = " > A ? " @ B B B " 0B
%rin parcur2erea arborilor binari se nelege' ca i la grafurile obinuite' examinarea n mod sistematic a
nodurilor astfel nct fiecare nod s fie atins o singur dat. Aceast procedur se mai numete i ,i.i'are a
nodurilor arborelui n scopul prelucrrii informaiei coninut de fiecare dintre acestea. (eoarece arborii sunt o
structur neliniar de date' rolul traversrii este tocmai obinerea unei aran&ri liniare a nodurilor' pentru ca trecerea
de la unul la altul s se realizeze ct mai simplu posibil. 0xist trei modaliti de parcurgere a arborilor binari' toate
utiliznd modul standard de reprezentare !sau alocarea dinamic#: n preordine !Rdcin/tngaDreapta#' n
inordine !/tngaRdcinDreapta# i n po('ordine !/tngaDreaptaRdcin#. Aceste trei sunt definite
recursiv i parcurgerea se face n trei etape:
aB ;ra,er(area +n preordine AR/DB
- se viziteaz rdcina
- traverseaz subarborele stng
- traverseaz subarborele drept
bB ;ra,er(area +n inordine A/RDB
- se traverseaz subarborele stng
- se viziteaz rdcina
- se traverseaz subarborele drept
cB ;ra,er(area +n po('ordine A/DRB
- se traverseaz subarborele stng
- se traverseaz subarborele drept
- se viziteaz rdcina
%entru arborele binar din figura de mai sus' avem urmtoarele rezultate ale parcurgerilor:
- metoda R/D: 1, 2, 4, 5, 6, 7, 8, 9, 3
- metoda /RD: 4, 2, 6, 5, 8, 7, 9, 1, 3
- metoda /DR: 4, 6, 8, 9, 7, 5, 2, 3, 1
%rogramul care implementeaz cele trei metode de parcurgere !bazate pe o strategie (01# este prezentat n
continuare:
-inc.ude/iostrea01
usin na0espace std;
-define ' 30
int A&',,D&',,rad,n;
;oid A"D(int E) //parcurgere inordine
2
if(A&E,) A"D(A&E,);
cout//E//5 5;
if(D&E,) A"D(D&E,);
3
;oid "AD(int E) //parcurgere preordine
2
6
Nodul i 1 # 0 4 5 = > ? @
;A;A8i9 & 1 1 # # 5 5 > >
D</C8i9 & 1 1 1 1 1 1 1 1
cout//E//5 5;
if(A&E,) "AD(A&E,);
if(D&E,) "AD(D&E,);
3
;oid AD"(int E) //parcurgere postordine
2
if(A&E,) AD"(A&E,);
if(D&E,) AD"(D&E,);
cout//E//5 5;
3
int 0ain()
2
int i;
cout//5nu0ar ;arfuri, n75;
do2
cin11n;
38@i.e(n/1FFn1');
cout//5radacina arBore.ui6 5;
do2
cin11rad;
38@i.e(rad/1FFrad1n);
//memorarea arborelui prin vectorii S,D
for(i71;i/7n;i::)
2
cout//5descendentii stana,dreapta (5//i//5)6 5;
cin11A&i,11D&i,;
3
cout//5=n=t<arcurerea in preordine6=n5;
"AD(rad);
cout//5=n=n=t<arcurerea in inordine6=n5;
A"D(rad);
cout//5=n=n=t<arcurerea in postordine6=n5;
AD"(rad);
cout//5=n5;
return 0;
3
=. Alocarea dina%ic a arborilor binari
n acest mod de alocare' fiecare nod este o structur cu trei cmpuri: informaia ataat nodului' adresa
fiului stng i adresa fiului drept. Absena unui fiu este marcat cu pointerul nul. Se observ c acest mod de
reprezentare este similar cu reprezentarea standard de la alocarea static a arborilor binari. %entru descrierea unui
nod putem folosi declaraiile:
typedef struct nod{
int inf; //sau orice alt tip pentru informaie
nod *st,*dr; //adresele fiilor
}!"#;
Crearea unui arbore binar alocat dinamic se realizeaz cel mai uor aplicnd metoda (01 astfel:
se genereaz un nod' adic se aloc spaiu n $eap i se ncarc informaia
pentru fiecare nod se construiete subarborele su stng' apoi subarborele su drept i se completeaz
adresele descendenilor nodului cu adresele acestor subarbori
un descendent vid trebuie marcat printro
proprietate stabilit asupra informaiei !spre
exemplu apariia valorii " drept coninut
informaional al nodului curent#
Spre exemplu' pentru arborele binar urmtor
irul datelor furnizat la intrare va arta astfel: 1 2 4 0 0
5 7 0 0 0 3 0 6 8 0 0 9 0 0 ceea ce
corespunde unei liste n preordine a nodurilor.
7
/uncia care creaz un arbore binar furnizat ca mai sus este:
typedef struct nod2
int inf;
nod *st,*dr;
3!"#;
;oid 4reare(!"#* Gr)
2
int >;
cin11>;
if(H>) //urmeaza subarbore vid
r70;
e.se
2
r7ne8 !"#; r91inf7>;
//creare nod curent si memorare informatie
4reare(r91st); 4reare(r91dr); //crearea subarborilor
3
3
/uncia CreareAB se poate proiecta astefel nct s ntoarc adresa rdcinii arborelui. n acest caz' funcia
va avea antetul: !"#* 4reare(!"#* Gr).
1arcur2erea arborilor binari poate fi fcut:
n adncime !pe subarbori# n trei moduri: preordine !R/D#' inordine !/RD#' postordine!/DR#
n lime !pe niveluri' ca la arborii oarecare#
%rogramul urmtor realizeaz crearea unui arbore binar i afieaz listele nodurilor obinute pein cele trei metode
de parcurgere n adncime.
-inc.ude/iostrea01
usin na0espace std;
typedef struct nod2
int inf;
nod *st,*dr;
3!"#;
;oid 4reare(!"#* Gr)
2
int >;
cin11>;
if(H>) //urmeaza subarbore vid
r70;
e.se
2
r7ne8 !"#; r91inf7>;
//creare nod curent si memorare informatie
4reare(r91st); 4reare(r91dr); //crearea subarborilor
3
3
;oid A"D(!"# *r) //parcurgere inordine
2
if(r)
2
A"D(r91st); cout//r91inf//5 5; A"D(r91dr);
3
3
;oid "AD(!"# *r) //parcurgere preordine
2
8
if(r)
2
cout//r91inf//5 5; "AD(r91st); "AD(r91dr);
3
3
;oid AD"(!"# *r) //parcurgere postordine
2
if(r)
2
AD"(r91st); AD"(r91dr); cout//r91inf//5 5;
3
3
;oid Atere(!"# *r)
2
if(r)
2
Atere(r91st); Atere(r91dr); de.ete r;
3
3
int 0ain()
2
!"# *rad; //adresa radacinii arborelui
cout//5*ntroduceti noduri.e 6 5;
4reare(rad); //crearea arborelui binar
cout//5=n'oduri.e in inordine6 5; A"D(rad);
cout//5=n'oduri.e in preordine6 5; "AD(rad);
cout//5=n'oduri.e in postordine6 5; AD"(rad);
cout//5=n5;
Atere(rad); //stergerea arborelui din heap
return 0;
3
>. -or%a polone. a e)pre(iilor ari'%e'ice
Se mai numete notaia fr paranteze a expresiilor aritmetice i de studiul acestei probleme sa ocupat
matematicianul polonez 5. 6u7asie8icz. (eoarece ntro expresie aritmetic' un operator se aplic unui operand
sau unei perec$i de operanzi' sa a&uns la ideea de a asocia unei expresii aritmetice un arbore binar. %resupunem
c se noteaz cu <1 respectiv cu <# dou expresii aritmetice crora li se aplic operatorul notat 9op:. ;peratorii pe
care i vom accepta sunt doar operatorii binari' i anume: adunarea A7B" scderea AB" nmulirea ACB" mprirea ADB i
ridicarea la putere AEB. %entru a asocia unei expresii aritmetice fr paranteze un arbore binar se folosesc
urmtoarele reguli:
- unei expresii aritmetice format dintrun singur operand i se asociaz un arbore binar format doar din nodul
rdcin n care se pune operandul respectiv
- dac expresia aritmetic < este de forma <1 op <#' atunci arborele binar complt asociat are ca rdcin
operatorul op' ca subarbore stng are arborele binar asociat expresiei aritmetice <1' iar ca subarbore drept
are arborele binar asociat expresiei aritmetice <#
<)e%plu: /ie expresiile cele mai simple care se pot forma cu operatorii binari cunoscui: a7b' ab' aCb' aDb i a
b
.
*onsidernd op unul dintre operatorii binari 7""C"D"' arborele binar asociat este
cel din figura urmtoare:
<)e%plu: /ie expresia <FaCb7cDde. )e propunem s determinm arborele
binar asociat. Se observ c' deoarece nu este stabilit modul de asociere a
termenilor' se pot obine doi arbori binari' dup cum se consider <1FaCb7cDd i <#Fe' sau <1FaCb i <#FcDde. Se
obin corespunztor arborii din figura de mai &os.
9
Aceti arbori binari se pot parcurge folosind
oricare din cele trei metode. Se obine
astfel:
R/D: 7CabDcde re(pec'i,
R/D: 7CabDcde
/RD: aCb7cDde re(pec'i,
/RD: aCbcDde
/DR: abCcdD7e re(pec'i,
/DR: abCcdDe7
<irul obinut prin parcurgerea n preordine a arborelui binar ataat expresiei aritmetice se numete for%a polone.
prefi)a' asociat expresiei' iar irul obinut prin prin parcurgerea n postordine se numete for%a polone.
po('fi)a' asociat expresiei aritmetice.
Ob(er,aii: Se poate construi arborele binar asociat i pentru o expresie aritmetic care conine paranteze
rotunde. n forma polonez nu apar parantezele' acestea nemaifiind necesare pentru a marca prioritile de calcul.
%rogramul urmtor citete o expresie aritmetic care conine paranteze rotunde' operanzi de o liter i
operatori binari 7""C"D i construiete forma polonez prefixat. %entru a construi n memorie arborele binar ataat
pornind de la expresia aritmetic !citit ca ir de caractere# se acord prioriti operatorilor i operanzilor astfel:
- prioritatea iniial a operatorilor =' este ,
- prioritatea iniial a operatorilor >'? este ,"
- la prioritatea unui operand se adaug zece uniti pentru fiecare perec$e de paranteze ntre care se
gsete
- prioritatea unui operand este ,"""
*onstruirea prioritilor se realizeaz astfel:
- se citete expresia aritmetic n irul de caractere e
- se utilizeaz o variabil G care indic ce valoare se adaug la prioritatea iniial a unui operator !la ntlnirea
unei paranteze desc$ise G crete cu ,"' iar la ntlnirea unei paranteze nc$ise scade cu ,"#
- se parcurge expresia caracter cu caracter i se memoreaz n vectorul p prioritile operatorilor i
operanzilor
- n vectorul efp se construiete expresia aritmetic fr paranteze' iar n pfp se obine vectorul prioritilor
din care' spre deosebire de epf' lipsesc componentele corespunztoare parantezelor
- utiliznd vectorii efp i pfp funcia CreareAB construiete n $eap arborele binar ataat expresiei aritmetice.
*onform te$nicii Divide Et Impera' funcia CreareAB lucreaz astfel:
- de la limita superioar !l(# ctre cea inferioar !li#' limite corespunztoare irurilor din efp' se caut
operandul sau operatorul cu prioritate minim' reinnduse i poziia acestuia
- n situaia n care limita superioar este diferit de cea inferioar' pentru completarea adresei subarborelui
stng' respectiv drept' se reapeleaz funcia CreareAB
-inc.ude/iostrea01
-inc.ude/strinI@1
usin na0espace std;
-define (!) 100
typedef struct nod2
c@ar inf;
nod *st,*dr;
3!"#;
c@ar e&(!),,efp&(!),;
int p&(!),,pfp&(!),;
!"# *rad;
;oid 4reare(!"#* Gc,int .i,int .s,c@ar epf&,,int pfp&,)
2
int i,J,0in;
0in7pfp&.s,; i7.s;
for(J7.s;J17.i;J99)
if(pfp&J,/0in) 2 0in7pfp&J,; i7J; 3
c7ne8 !"#; c91inf7efp&i,;
if(.i77.s)
10
c91st7c91dr70;
e.se
2
4reare(c91st,.i,i91,efp,pfp);
4reare(c91dr,i:1,.s,efp,pfp);
3
3
;oid <arcurere(!"# *c)
2
if(c)
2
cout//c91inf;<arcurere(c91st); <arcurere(c91dr);
3
3
int 0ain()
2
int i,J70;
cout//5introduceti e>presia6 5; ets(e);
for(i70;e&i,;i::)
s8itc@(e&i,)
2
case K)K6 J9710; BreaE;
case K(K6 J:710; BreaE;
case K:K6
case K9K6 p&i,7J:1; BreaE;
case K*K6
case KCK6 p&i,7J:10; BreaE;
defau.t6 p&i,71000;
3
J791;
for(i70;e&i,;i::)
if(e&i,H7K)KGGe&i,H7K(K)
2
J::; efp&J,7e&i,; pfp&J,7p&i,;
3
4reare(rad,0,J,efp,pfp);
cout//5=n+or0a po.oneLa prefi>ata este6 5;
<arcurere(rad); cout//5=n5;
return 0;
3
@odul n care se folosete forma polonez prefixat pentru evaluarea expresiei aritmetice asociate este
urmtorul: se parcurge forma polonez prefixat de la dreapta la stnga utiliznduse o stiv pentru memorarea
operanzilor. (ac simbolul curent este un operand' el se introduce n vrful stivei. (ac simbolul citit este un
operator' se aplic acest operator primilor doi operanzi din vrful stivei obinnduse un rezultat. *ei doi operanzi
sunt eliminai din stiv i n locul lor se trece rezultatul obinut. Se trece apoi la urmtorul simbol care conine forma
polonez prefixat asociat expresiei aritmetice.
%rogramul urmtor ilustreaz aceast modalitate de evaluare a expresiilor aritmetice. ;peranzii sunt
identificai printro singur liter' iar operatorii sunt binari din mulimea 7""C"D.
-inc.ude/iostrea01
-inc.ude/strinI@1
usin na0espace std;
c@ar e&100,;
f.oat s&100,,>,y; //s este stiva
int n,i,p;
int 0ain()
2
cout//5=t*ntroduceti e>presia arit0etica in for0a prefi>ata=n5;
ets(e); n7str.en(e);
for(i7n91;i170;i99)
if(e&i,77K:KFFe&i,77K9KFFe&i,77K*KFFe&i,77KCK)
11
2
>7s&p99,; y7s&p,;
s8itc@(e&i,)
2
case K:K6 s&p,7>:y; BreaE;
case K9K6 s&p,7>9y; BreaE;
case K*K6 s&p,7>*y; BreaE;
case KCK6 s&p,7>Cy; BreaE;
3
3
e.se
s&::p,7e&i,9K0K;
cout//5=n;a.oarea e>presiei este 5//s&1,//end.;
return 0;
3
12

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