Mai intai trebuie sa te autentifici.
Cod sursa(job #697776)
Utilizator | Data | 29 februarie 2012 10:57:52 | |
---|---|---|---|
Problema | Evaluarea unei expresii | Scor | 40 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.18 kb |
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NMAX 100010
using namespace std;
int p[NMAX];
char e[NMAX];
int calcExpr(char op, int x, int y){
switch (op){
case '+':
return x+y;
break;
case '-':
return x-y;
break;
case '*':
return x*y;
break;
case '/':
return x/y;
break;
}
return 0;
}
int calc(int st, int dr){
int i,pmin=p[st],pozmin=st,aux=e[dr+1];
e[dr+1]=0;
if (strchr(e+st,'-')||strchr(e+st,'+')||strchr(e+st,'*')||strchr(e+st,'/')){
e[dr+1]=aux;
for (i=st+1;i<=dr;i++){
if (pmin>p[i]){
pmin=p[i]; pozmin=i;
}
}
return calcExpr(e[pozmin],calc(st,pozmin-1),calc(pozmin+1,dr));
}else{
i = atoi(e+st);
e[dr+1]=aux;
return i;
}
}
int main(){
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
int n,i,j,pc=0,k=0,poz,r;
char s[NMAX];
scanf("%s", s);
n=strlen(s)-1;
for (i=0;i<=n;i++){
switch (s[i]){
case '+':
e[k]=s[i];
p[k]=pc+1;
k++;
break;
case '-':
e[k]=s[i];
p[k]=pc+1;
k++;
break;
case '*':
e[k]=s[i];
p[k]=pc+2;
k++;
break;
case '/':
e[k]=s[i];
p[k]=pc+2;
k++;
break;
case '(':
pc+=10;
break;
case ')':
pc-=10;
break;
case '=':
break;
default:
poz=strspn(s+i,"0123456789");
strncpy(e+k,s+i,poz);
for (j=k;j<k+poz;j++) p[j]=10000;
i+=poz-1; k+=poz;
break;
}
}
e[k]=0;
- k--;
r=calc(0,k);
printf("%d", r);
return 0;
}