Cod sursa(job #2302948)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 15 decembrie 2018 11:50:25
Problema Evaluarea unei expresii Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <string>
#include <fstream>
 
using namespace std;
 
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
 
istream & in = fin;
ostream & out = fout;
 
string s;
int GetPriority(char c)
{
    if(c == '+' || c == '-'){
        return 0;
    }else if(c == '*' || c == '/'){
        return 1;
    }
}
 
bool IsDigit(char c)
{
    return (c >= '0' && c <= '9');
}
 
int Eval(int lt, int rt)
{
    int last = -1, priority = 100;
    int depth = 0;
    for(int i = lt; i < rt; i++){
        if(s[i] == '('){
            depth++;
        }else if(s[i] == ')'){
            depth--;
        }else if(!IsDigit(s[i]) && depth == 0 && priority >= GetPriority(s[i])){
            last = i;
            priority = GetPriority(s[i]);
        }
    }
    if(last != -1){
        if(s[last] == '+'){
            return Eval(lt, last) + Eval(last+1, rt);
        }else if(s[last] == '-'){
            return Eval(lt, last) - Eval(last+1, rt);
        }else if(s[last] == '*'){
            return Eval(lt, last) * Eval(last+1, rt);
        }else if(s[last] == '/'){
            return Eval(lt, last) / Eval(last+1, rt);
        } 
    }else{
        if(s[lt] == '(' && s[rt-1] == ')'){
            return Eval(lt+1, rt-1);
        }else{
            int a = 0;
            for(int i = lt; i < rt; i++){
                a *= 10;
                a += (s[i]-'0');
            }
            return a;
        }
    }
}
 
int main()
{
    in >> s;
    out << Eval(0, s.size());
    return 0;
}