Pagini recente » Cod sursa (job #2409483) | Cod sursa (job #2347414) | Cod sursa (job #3240294) | Cod sursa (job #2320855) | Cod sursa (job #1106609)
#include <cstdio>
using namespace std;
const int NMAX = 100005;
char expr[NMAX];
char char_stack[NMAX];
int number_stack[NMAX],number_pointer = 0, char_pointer = 0;
void read() {
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
scanf("%s", expr);
}
void compute_operation(int sp) {
number_pointer--;
switch (char_stack[sp]) {
case ('*'):
number_stack[number_pointer] *= number_stack[number_pointer + 1];
break;
case ('/'):
number_stack[number_pointer] /= number_stack[number_pointer + 1];
break;
case ('+'):
number_stack[number_pointer] += number_stack[number_pointer + 1];
break;
case ('-'):
number_stack[number_pointer] -= number_stack[number_pointer + 1];
break;
}
char_pointer--;
char_stack[sp] = char_stack[sp + 1];
}
bool reduce() {
if( char_pointer > 0 ) {
if( char_stack[char_pointer] == ')' ) {
if( char_stack[char_pointer - 1] == '(' ) {
char_pointer -= 2;
return true;
}
compute_operation(char_pointer - 1);
return true;
} else if ( char_stack[char_pointer] == '(' )
return false;
else {
if( char_pointer > 1 ) {
if ( char_stack[char_pointer - 1] == '*' || char_stack[char_pointer - 1] == '/' ) {
compute_operation(char_pointer - 1);
return true;
} else if( (char_stack[char_pointer] == '+' || char_stack[char_pointer] == '-') &&
(char_stack[char_pointer - 1] != '(' && char_stack[char_pointer - 1] != ')')){
compute_operation(char_pointer - 1);
return true;
}
}
return false;
}
}
return false;
}
void solve() {
int i = 0;
while(expr[i] != '\0') {
if(expr[i] < '0' || expr[i] > '9') {
char_stack[++char_pointer] = expr[i];
} else {
int n = 0;
while(expr[i] >= '0' && expr[i] <= '9') {
n = n * 10 + (expr[i] - '0');
i++;
}
i--;
number_stack[++number_pointer] = n;
}
while(reduce())
;
i++;
}
while(char_pointer > 0)
compute_operation(char_pointer);
}
int main() {
read();
solve();
printf("%d", number_stack[number_pointer]);
return 0;
}