Cod sursa(job #2710137)

Utilizator ValiAntonieAntonie Valentin ValiAntonie Data 21 februarie 2021 21:50:02
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.13 kb
#include <bits/stdc++.h>
using namespace std;

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

long long ordine(char op){
    if(op == '+' || op == '-')
        return 1;
    else if(op == '*' || op == '/')
        return 2;
    else
        return 0;
}

long long operatii(long long a, long long b, char op){
    if(op == '+')
        return a + b;
    if(op == '-')
        return a - b;
    if(op == '*')
        return a * b;
    if(op == '/')
        return a / b;
}

stack <long long> values;
stack <char> ops;

long long i;
string s;
int main()
{
fin>>s;
for(i=0;i<s.length();i++){
    if(s[i] == '(')
       ops.push(s[i]);
    else if(isdigit(s[i])){
        long long val = 0;
        while(i < s.length() && isdigit(s[i])){
            val = (val * 10) + (s[i] - '0');
            i++;
        }
        values.push(val);
        i--;
    }
    else if(s[i] == ')'){
        while(ops.empty() == false && ops.top() != '('){
            long long val1 = 0;
            long long val2 = 0;
            val2 = values.top();
            values.pop();
            if(values.empty() == false){
            val1 = values.top();
            values.pop();
            }
            char op = ops.top();
            ops.pop();
            values.push(operatii(val1,val2,op));
        }
            if(!ops.empty())
               ops.pop();
    }
    else{
        while(ops.empty() == false && ordine(ops.top()) >= ordine(s[i])){
            long long val1 = 0;
            long long val2 = 0;
            val2 = values.top();
            values.pop();
            if(values.empty() == false){
            val1 = values.top();
            values.pop();
            }
            char op = ops.top();
            ops.pop();
            values.push(operatii(val1,val2,op));
        }
        ops.push(s[i]);
    }
}
while(ops.empty() == false){
    long long val2 = values.top();
    values.pop();
    long long val1 = values.top();
    values.pop();
    char op = ops.top();
    ops.pop();
    values.push(operatii(val1,val2,op));
}
fout << values.top();
    return 0;
}