Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #3141036)
#include <fstream>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
const int STRLEN_MAX = 1e5;
const int CHARACTERS = 128;
char priority[CHARACTERS];
char s[STRLEN_MAX + 1];
int sIndex;
void PrecomputePriority() {
for(auto i: priority)
i = 0;
priority['+'] = priority['-'] = 1;
priority['*'] = priority['/'] = 2;
}
int addition();
int factor() {
int num = 0;
if(s[sIndex] == '('){
++sIndex;
num = addition();
++sIndex;
}else
while(isdigit(s[sIndex]))
num = num * 10 + s[sIndex++] - '0';
return num;
}
int multiply() {
int result = factor();
while(priority[s[sIndex]] == 2)
if(s[sIndex] == '*'){
++sIndex;
result *= factor();
}else{
++sIndex;
result /= factor();
}
return result;
}
int addition() {
int result = multiply();
while(priority[s[sIndex]] == 1)
if(s[sIndex] == '+'){
++sIndex;
result += multiply();
}else{
++sIndex;
result -= multiply();
}
return result;
}
int main() {
PrecomputePriority();
fin >> s;
sIndex = 0;
fout << addition() << '\n';
fin.close();
fout.close();
return 0;
}