Cod sursa(job #2818158)

Utilizator Xutzu358Ignat Alex Xutzu358 Data 15 decembrie 2021 13:22:48
Problema Evaluarea unei expresii Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("evaluare.in");
ofstream g("evaluare.out");

stack < char > operations;
stack < int > numbers;
char s[100005];
vector < int > nr;
vector < char > ops;
int aa;

void solve_nr() {
    int x = 0;
    while (isdigit(s[aa])!=0) {
        x = x*10 + s[aa]-'0';
        aa++;
    }
    numbers.push(x);
}

void solve_ops() {
    nr.push_back(numbers.top());
    numbers.pop();
    while (operations.empty()==0 && operations.top()!='(') {
        nr.insert(nr.begin(),numbers.top());
        ops.insert(ops.begin(),operations.top());
        numbers.pop();
        operations.pop();
    }
    if (operations.empty()==0) {
        operations.pop();
    }
    int aux=nr[0];
    for (int i=0;i<ops.size();i++) {
        if (ops[i]=='*') {
            aux = nr[i]*nr[i+1];
            nr[i+1]=aux; nr[i]=aux;
        }
        else if (ops[i]=='/') {
            aux = nr[i]/nr[i+1];
            nr[i+1]=aux; nr[i]=aux;
        }
    }
    for (int i=0;i<ops.size();i++) {
        if (ops[i]=='+') {
            aux = nr[i]+nr[i+1];
            nr[i+1]=aux; nr[i]=aux;
        }
        else if (ops[i]=='-') {
            aux = nr[i]-nr[i+1];
            nr[i+1]=aux; nr[i]=aux;
        }
    }
    numbers.push(aux);
    nr.clear(); ops.clear();
}

int main()
{
    f >> s;
    while (aa!=strlen(s)) {
        if (isdigit(s[aa])!=0) {
            solve_nr();
        }
        else if (s[aa]==')') {
            solve_ops();
            aa++;
        }
        else {
            operations.push(s[aa]);
            aa++;
        }
    }
    solve_ops();
    g << numbers.top();
    return 0;
}