#include #include #include typedef struct drvo { union sadrzaj { int broj; char znak; }sadrzaj; struct drvo *levi, *desni; }drvo; typedef struct stek{ drvo *izraz; struct stek *s; }stek; void dodajUStek(stek **S, drvo *novi){ stek *pom = (stek*)malloc(sizeof(stek)); pom->izraz = novi; pom->s = *S; *S = pom; } void skiniSaSteka(stek **S, drvo **izraz){ *izraz = (*S) -> izraz; *S = (*S) -> s; } void ulaz(drvo **D){ char c; stek *S = NULL; int broj = 0; while((c = getchar()) != EOF){ if(c <= '9' && c >= '0') broj = broj * 10 + c - '0'; else if(c == '+' || c == '-' || c == '*' || c == '/'){ if(broj){ drvo *novi = (drvo*)malloc(sizeof(drvo)); novi -> sadrzaj.broj = broj; novi->levi = novi ->desni = NULL; dodajUStek(&S, novi); broj = 0; } drvo *novi = (drvo*)malloc(sizeof(drvo)); novi -> sadrzaj.znak = c; novi->levi = novi ->desni = NULL; dodajUStek(&S, novi); } else if(c == ')'){ if(broj){ drvo *novi = (drvo*)malloc(sizeof(drvo)); novi -> sadrzaj.broj = broj; novi->levi = novi ->desni = NULL; dodajUStek(&S, novi); broj = 0; } drvo *izraz1; skiniSaSteka(&S,&izraz1); drvo *operacija; skiniSaSteka(&S,&operacija); drvo *izraz2; skiniSaSteka(&S,&izraz2); operacija->levi = izraz2; operacija->desni = izraz1; dodajUStek(&S,operacija); } } *D = S->izraz; } void ispis(drvo *D){ if(D->levi && D->desni){ putchar('('); ispis(D->levi); putchar(D->sadrzaj.znak); ispis(D->desni); putchar(')'); } else printf("%d", D->sadrzaj.broj); } int izracunaj(drvo *D){ if(D->levi && D->desni){ int l = izracunaj(D->levi); int d = izracunaj(D->desni); if(D->sadrzaj.znak == '+') return l+d; else if(D->sadrzaj.znak == '*') return l*d; else if(D->sadrzaj.znak == '-') return l-d; else return l/d; } return D->sadrzaj.broj; } int main(){ drvo *D = NULL; ulaz(&D); printf("%d\n", izracunaj(D)); ispis(D); return 0; }