Pagini recente » Profil Sever.Nastase | Cod sursa (job #1552) | Cod sursa (job #2056976) | gabe | Cod sursa (job #302279)
Cod sursa(job #302279)
#include <iostream>
#include <algorithm>
#include <cstring>
#define FIN "evaluare.in"
#define FOUT "evaluare.out"
#define MAX 100010
using namespace std;
char s[MAX-2];
int st[MAX];
int vf,vf_op;
char st_op[MAX];
int isnum(int c){
if (c>='0' && c<='9'){ return 1;} else {return 0;}
}
void iofile(void){
freopen(FIN,"rt",stdin);
freopen(FOUT,"wt",stdout);
fgets(s+1,MAX,stdin);
}
void bang_st(int op){
// printf("BANG! %d %d %c\n",st[vf-1],st[vf],op);
if (op=='+'){ st[vf-1]+=st[vf];--vf;} else
if (op=='-'){ st[vf-1]-=st[vf];--vf;} else
if (op=='/'){ st[vf-1]/=st[vf];--vf;} else
if (op=='*'){ st[vf-1]*=st[vf];--vf;}
--vf_op;
}
int prio(int c){
if (c=='/' || c=='*'){ return 2;} else if (c=='('){ return 5;} else { return 1;}
}
void solve(void){
int N=strlen(s+1);
while ((!isnum(s[N]))&&(s[N]!='-' && s[N]!='+' && s[N]!='(' && s[N]!=')' && s[N]!='*' && s[N]!='/')) --N;
int defnum=0;
int num=0;
vf=0;
vf_op=0;
for (int i=1;i<=N;++i){
if (isnum(s[i])){defnum=1; num*=10; num+=s[i]-'0'; } else
if (s[i]=='('){st_op[++vf_op]='('; if (defnum){st[++vf]=num; }; defnum=0;num=0;} else
if (s[i]==')'){
if (defnum){ st[++vf]=num;};
while (st_op[vf_op]!='(' && vf_op>0 ) bang_st(st_op[vf_op]); defnum=0;num=0;
if (vf_op>0 && st_op[vf_op]=='('){--vf_op;}
} else {
if (defnum){ st[++vf]=num;};
defnum=0;
num=0;
if (vf_op>0 && prio(st_op[vf_op])>=prio(s[i])) {
while (vf_op>0 && prio(st_op[vf_op])>=prio(s[i])) bang_st(st_op[vf_op]);
}
st_op[++vf_op]=s[i];
}
}
if (defnum){st[++vf]=num;}
while (vf_op) bang_st(st_op[vf_op]);
printf("%d\n",st[1]);
fclose(stdout);
}
int main(void){
iofile();
solve();
return 0;
}