Cod sursa(job #2144420)

Utilizator EdgeLordXDOvidiuPita EdgeLordXD Data 26 februarie 2018 18:55:34
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("evaluare.in");
ofstream out("evaluare.out");
#define ll long long
string s;
int n1=0, n2=0;
ll v[100001];
char o[100001];
ll add(char op, ll a, ll b){
    switch(op){
        case '+': return a+b;
        case '-': return a-b;
        case '*': return a*b;
        case '/': return a/b;
    }
}
int exp(){
    int i;
    for(i=0; i<s.length(); ++i){
        if(s[i]>='0' && s[i]<='9'){
            if(s[i-1]>='0' && s[i-1]<='9')
                v[n1]=v[n1]*10+int(s[i])-48;
            else
                v[++n1]=int(s[i])-48;
        }
        else if(s[i]=='(')
            o[++n2]='(';
        else if(s[i]==')'){
            while(o[n2]!='('){
                --n2, --n1;
                v[n1]=add(o[n2+1], v[n1], v[n1+1]);
            }
            --n2;
        }
        else{
            if(s[i]=='+' || s[i]=='-'){
                while(n2!=0 && o[n2]!='('){
                    --n2, --n1;
                    v[n1]=add(o[n2+1], v[n1], v[n1+1]);
                }
            }
            else{
                while(n2!=0 && o[n2]!='(' && o[n2]!='+' && o[n2]!='-'){
                    --n2, --n1;
                    v[n1]=add(o[n2+1], v[n1], v[n1+1]);
                }

            }
            o[++n2]=s[i];
        }
    }
    while(n2>0){
        --n2, --n1;
        v[n1]=add(o[n2+1], v[n1], v[n1+1]);
    }
    return v[1];
}
int main(){
    in>>s;
    out<<exp();
}