Pagini recente » Cod sursa (job #241971) | Cod sursa (job #403316) | Cod sursa (job #1090093) | Cod sursa (job #3163726) | Cod sursa (job #597254)
Cod sursa(job #597254)
#include <cstdio>
#include <cstring>
using namespace std;
char s[100005];
int x[100005], n;
char op[] = {"0+-*/()"};
int ord[7] = {0, 0 , 0, 1, 1, 2, 2};
int chartoint(int &i) {
int nr = 0;
while(s[i] <= '9' && s[i] >= '0' && i < n){
nr = nr * 10 + s[i] - '0';
++i;
}
return nr;
}
int main() {
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
fgets(s, 100001, stdin);
int i = 0, nr = 0, sign;
int stack[100001];
n = strlen(s);
int vf = 0;
while(i < n) {
if(s[i] >= '0' && s[i] <= '9')
x[++nr] = chartoint(i), --i;
int j;
for(j = 1; j <= 4; ++j)
if(s[i] == op[j]) {
while(stack[vf]!= 5 && ord[j] <= ord[stack[vf]] && vf){
x[++nr] = -stack[vf];
--vf;
}
stack[++vf] = j;
}
if(s[i] == '(')
stack[++vf] = 5;
if(s[i] == ')') {
while(stack[vf] != 5) {
x[++nr] = -stack[vf];
--vf;
}
--vf;
}
++i;
}
while(vf){
x[++nr] = -stack[vf];
--vf;
}
// return 0;
vf = 0;
for(i = 1; i <= nr; ++i) {
if(x[i] >= 0)
stack[++vf] = x[i];
else {
int a = stack[vf];
--vf;
int b = stack[vf];int rez = 0;
--vf;
// printf("%d %d ", a, b);
switch ( x[i] ) {
case -1 :
rez = a + b;
break;
case -2 :
rez = b - a;
break;
case -3 :
rez = a * b;
break;
case -4 :
rez = b / a;
break;
}
// printf("%d\n", rez);
stack[++vf] = rez;
}
}
printf("%d\n", stack[1]);
// for(i = 1;i <= nr; ++i)
// printf("%d\n", x[i]);
return 0;
}