Cod sursa(job #2815918)

Utilizator vlvdVlad Hosu vlvd Data 10 decembrie 2021 16:55:18
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

ifstream fin("a.in");
ofstream fout("a.out");

char s[100005];

int semn(int st, int dr, char semn1, char semn2) {
    int p=0;
    for (int i=dr; i>=st; i--)
        if (s[i]==')')
            p--;
        else if (s[i]=='(')
            p++;
        else if ((s[i]==semn1 || s[i]==semn2) && p==0)
            return i;
    return -1;
}

int verifparanteze(int st, int dr) {
    int p=0;
    for (int i=st; i<=dr; i++) {
        if (s[i]==')')
            p--;
        else if (s[i]=='(')
            p++;
        if (p<0)
            return 0;
    }
    return p==0;
}

int formarenumar(int st, int dr) {
    int nr=0;
    for (int i=st; i<=dr; i++)
        nr=nr*10+(s[i]-'0');
    return nr;
}

int eval(int st, int dr) {
    if (s[st]=='(' && s[dr]==')')
        if (verifparanteze(st+1, dr-1))
            return eval(st+1, dr-1);
    int p=semn(st, dr, '+', '-');
    if (p==-1)
        p=semn(st, dr, '*', '/');
    if (p==-1)
        return formarenumar(st, dr);
    switch (s[p]) {
        case '+':
            return eval(st, p-1)+eval(p+1, dr);
        case '-':
            return eval(st, p-1)-eval(p+1, dr);
        case '/':
            return eval(st, p-1)/eval(p+1, dr);
        case '*':
            return eval(st, p-1)*eval(p+1, dr);
    }
}

int main() {
    fin>>s;
    fout<<eval(0, strlen(s)-1);
    return 0;
}