Cod sursa(job #2923706)

Utilizator cristianabalcanuCristiana Balcanu cristianabalcanu Data 18 septembrie 2022 12:02:49
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.31 kb
#include <bits/stdc++.h>

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

string s;
stack <int> sv;
stack <char> sc;

int prioritate(char op)
{
    if(op == '*' || op == '/')
        return 2;
    return 1;
}

int apply(int v1, int v2, char c)
{
    if(c == '/')
        return v1 / v2;
    if(c == '*')
        return v1 * v2;
    if(c == '+')
        return v1 + v2;
    if(c == '-')
        return v1 - v2;
    return 0;
}

bool estecif(char c)
{
    if(c >= '0' && c <= '9')
        return true;
    return false;
}

int eval()
{
    for(int i = 0 ; i < s.size() ; i++)
    {
        if(s[i] == ' ')
            continue;
        if(estecif(s[i]))
        {
            int val = 0;
            while(i < s.size() && estecif(s[i]))
            {
                val = val * 10 + s[i] - '0';
                i++;
            }
            i--;
            sv.push(val);
        }
        else if(s[i] == '(')
            sc.push('(');
        else if(s[i] == ')')
        {
            while(sv.size() >= 2 && !sc.empty() && sc.top() != '(')
            {
                int v1 = sv.top();
                sv.pop();
                int v2 = sv.top();
                sv.pop();
                char op = sc.top();
                sc.pop();
                int ans = apply(v2, v1, op);
                sv.push(ans);
            }
            if(sc.empty() != 1 && sc.top() == '(')
                sc.pop();
        }
        else
        {
            while(sv.size() >= 2 && !sc.empty() && prioritate(sc.top()) >= prioritate(s[i]))
            {
                int v1 = sv.top();
                sv.pop();
                int v2 = sv.top();
                sv.pop();
                char op = sc.top();
                sc.pop();
                int ans = apply(v2, v1, op);
                sv.push(ans);
            }
            sc.push(s[i]);
        }
    }
    while(sv.size() >= 2 && !sc.empty())

    {
        int v1 = sv.top();
        sv.pop();
        int v2 = sv.top();
        sv.pop();
        char op = sc.top();
        sc.pop();
        int ans = apply(v2, v1, op);
        sv.push(ans);
    }
    return sv.top();
}

int main()
{
    fin >> s;
    int ans = eval();
    fout << ans;
    return 0;
}