Forum » Programiranje » postfiksna oblika aritmetičnega izraza
postfiksna oblika aritmetičnega izraza
wicked00 ::
Aritmetični izraz zapiši v postfiksni obliki. Prikaži uporabo skladovnega stroja pri izračunu vrednosti aritmetičnega izraza, če imajo spremenljivke naslednje vrednosti: a=6, b=2, c=3, d=4, e=1, f=10, g=8, h=5, l=3.
a+b*c ^(d+e) - f+ (g+h)^l
Tole je naloga, ki je ne znam rešiti, saj nisem bil zaradi osebnih razlogov na predavanjih..
Prosim, če mi lahko kdo pomaga.
Lp in hvala!
a+b*c ^(d+e) - f+ (g+h)^l
Tole je naloga, ki je ne znam rešiti, saj nisem bil zaradi osebnih razlogov na predavanjih..
Prosim, če mi lahko kdo pomaga.
Lp in hvala!
ERGY ::
http://www.webis.de/pan-09/competition....
Da ti olajšam delo. Imaš na prosojnici 6 lep primer od strani 14 naprej.
Da ti olajšam delo. Imaš na prosojnici 6 lep primer od strani 14 naprej.
Zgodovina sprememb…
- spremenilo: ERGY ()
darkkk ::
Zadeve so dejansko dokaj simpl, samo moraš vedet kaj delaš.
Kako zadeve v principu delujejo:
(a+b) * c -> evaluacija izraza je dejansko pregled dvojiškega drevesa *{+{a,b},c} kjer je to poljski zapis (oz. prefixna oblika oz... kakorkoli že to imenuješ). Nižja kot je prioriteta operatorja, višje v drevesu živi (operator, ki se "evaluira" zadnji, je v korenu). Potenciranje je "skoraj brezveze" v smislu, da lahko ti izraz na neko potenco obravnavaš kot spremenljivko v začetnem računu in jo evaluiraš posebej, v novem drevesu. Dejansko na ta način lahko notri zapakiraš funkcije ipd. Npr, x * sin(x) narediš preprosto tako, da v drevesu originalnega izraza uporabljaš sin(x) kot spremenljivko.
Vrednosti posameznih spremenljivk vodiš v enem seznamu (če boš delu v c++, list, java ma ziher kaj implementirano itd.).
Ko boš to razumu, ti bo naloga izi.
Kako ponucat sklad:
Sklad uporabiš pri pregledu drevesa. Načeloma se drevesa splača pregledovati rekurzivno (simpl za napisat), samo zaradi mazohističnih oz. hitrostnih vzgibov lahko delaš pregled drevesa s skladom (načeloma je to DFS za nek splošn graf). Na hitro: pri rekurzivnem premem pregledu (na ta način dobiš npr prefixno obliko izraza, če maš v drevesu računski izraz): obdelaš koren, pregled levega poddrevesa,pregled desnega poddrevesa.
Brez rekurzije narediš to s skladom:
pregled(struct node *koren){
stack s;
s.push(koren);
while (!s.empty()){
node tmp = s.pop();
s.push(tmp.desni());
s.push(tmp.levi());
tmp.naredinekaj();
} //while
}//pregled
Tko nekak narediš nerekurzivni pregled: na sklad vržeš trenutno vozlišče, nato vržeš gor desnega in levega sina, ter pregledaš trenutno vozlišče. To počneš tokler sklad ni prazn - dejansko je še boljša do while zanka...
PS. ok, iz naslova vidim da rabiš postfix, samo gre za praktično isto stvar.
Kako zadeve v principu delujejo:
(a+b) * c -> evaluacija izraza je dejansko pregled dvojiškega drevesa *{+{a,b},c} kjer je to poljski zapis (oz. prefixna oblika oz... kakorkoli že to imenuješ). Nižja kot je prioriteta operatorja, višje v drevesu živi (operator, ki se "evaluira" zadnji, je v korenu). Potenciranje je "skoraj brezveze" v smislu, da lahko ti izraz na neko potenco obravnavaš kot spremenljivko v začetnem računu in jo evaluiraš posebej, v novem drevesu. Dejansko na ta način lahko notri zapakiraš funkcije ipd. Npr, x * sin(x) narediš preprosto tako, da v drevesu originalnega izraza uporabljaš sin(x) kot spremenljivko.
Vrednosti posameznih spremenljivk vodiš v enem seznamu (če boš delu v c++, list, java ma ziher kaj implementirano itd.).
Ko boš to razumu, ti bo naloga izi.
Kako ponucat sklad:
Sklad uporabiš pri pregledu drevesa. Načeloma se drevesa splača pregledovati rekurzivno (simpl za napisat), samo zaradi mazohističnih oz. hitrostnih vzgibov lahko delaš pregled drevesa s skladom (načeloma je to DFS za nek splošn graf). Na hitro: pri rekurzivnem premem pregledu (na ta način dobiš npr prefixno obliko izraza, če maš v drevesu računski izraz): obdelaš koren, pregled levega poddrevesa,pregled desnega poddrevesa.
Brez rekurzije narediš to s skladom:
pregled(struct node *koren){
stack s;
s.push(koren);
while (!s.empty()){
node tmp = s.pop();
s.push(tmp.desni());
s.push(tmp.levi());
tmp.naredinekaj();
} //while
}//pregled
Tko nekak narediš nerekurzivni pregled: na sklad vržeš trenutno vozlišče, nato vržeš gor desnega in levega sina, ter pregledaš trenutno vozlišče. To počneš tokler sklad ni prazn - dejansko je še boljša do while zanka...
PS. ok, iz naslova vidim da rabiš postfix, samo gre za praktično isto stvar.
Zgodovina sprememb…
- spremenil: darkkk ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Predstavitev dvojiškega drevesa z seznamomOddelek: Programiranje | 1937 (1537) | ktka |
» | [C++] Iskalno drevo implementacijaOddelek: Programiranje | 2278 (1836) | eXoo |
» | Za programerske teoretikeOddelek: Programiranje | 8803 (5605) | Jerry000 |
» | [C#]Računanje iz stringa?Oddelek: Programiranje | 1325 (1187) | jernejl |
» | [C#] izračun enačbeOddelek: Programiranje | 1654 (1482) | delfy |