Pagini recente » Rezultatele filtrării | Borderou de evaluare (job #2777726) | Rezultatele filtrării | Cod sursa (job #2846478) | Cod sursa (job #238912)
Cod sursa(job #238912)
#include <cstring>
#include <stack>
#include <fstream>
using namespace std;
const int MAX_N = 100005;
ifstream in("evaluare.in");
ofstream out("evaluare.out");
int N;
char s[MAX_N];
stack <int> Stack;
int Pair[MAX_N];
int evaluate(int, int);
int factor(int &p, int hi) {
int answer;
if(s[p] == '(') {
answer = evaluate(p + 1, Pair[p] - 1);
p = Pair[p] + 1;
}
else {
answer = 0;
while(p <= hi && s[p] >= '0' && s[p] <= '9')
answer = answer * 10 + (s[p++] - '0');
}
return answer;
}
int termen(int &p, int hi) {
int answer;
bool the_end = false;
for(answer = factor(p, hi); p <= hi && !the_end; )
switch(s[p]) {
case '*':
++p;
answer *= factor(p, hi);
break;
case '/':
++p;
answer /= factor(p, hi);
break;
default:
the_end = true;
}
return answer;
}
int evaluate(int lo, int hi) {
int answer, p = lo;
for(answer = termen(p, hi); p <= hi; )
if(s[p++] == '+')
answer += termen(p, hi);
else
answer -= termen(p, hi);
return answer;
}
int main() {
in >> s;
N = strlen(s);
for(int i = 0; i < N; ++i)
if(s[i] == '(')
Stack.push(i);
else if(s[i] == ')') {
Pair[Stack.top()] = i;
Stack.pop();
}
out << evaluate(0, N - 1);
return 0;
}