Cod sursa(job #3293795)

Utilizator GabiRB1Rafael GabiRB1 Data 12 aprilie 2025 16:44:22
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <bits/stdc++.h>
using namespace std;
deque <string> postfixat(string &s)
{
    map<string, int> prec;
    prec["+"] = prec["-"] = 1;
    prec["*"] = prec["/"] = 2;
    prec["("] = -1;
    long long nr = 0;
    deque <string> rez, q;
    for(int i = 0; s[i]; i ++)
    {
        if(s[i] <= '9' && s[i] >= '0')
        {
            while(s[i] <= '9' && s[i] >= '0')
            {
                nr = nr * 10 + s[i] - '0';
                i ++;
            }
            i --;
            rez.push_back(to_string(nr));
            nr = 0;
        }
        else
        {
            string c;
            c += s[i];
            if(s[i] == '(')
                q.push_back(c);
            else if(s[i] == ')')
            {
                while(q.back() != "(")
                    rez.push_back(q.back()), q.pop_back();
                q.pop_back();
            }
            else
            {
                while(!q.empty() && prec[c] <= prec[q.back()])
                    rez.push_back(q.back()), q.pop_back();
                q.push_back(c);
            }
        }
    }
    while(!q.empty())
        rez.push_back(q.back()), q.pop_back();
    return rez;
}
long long eval(deque <string> p)
{
    deque <int> q;
    while(!p.empty())
    {
        string c = p.front();
        p.pop_front();
        if(c[0] >= '0' && c[0] <= '9')
            q.push_back(stoi(c));
        else
        {

            long long nr1 = q.back(); q.pop_back();
            long long nr2 = q.back(); q.pop_back();
            if(c[0] == '-')
                q.push_back(nr2 - nr1);
            else if(c[0] == '+')
                q.push_back(nr2 + nr1);
            else if(c[0] == '*')
                q.push_back(nr2 * nr1);
            else q.push_back(nr2 / nr1);
        }
    }
    return q.back();
}
int main()
{
    ifstream f("evaluare.in");
    ofstream g("evaluare.out");

    string str;
    f >> str;
    deque <string> q;
    q = postfixat(str);
    long long rez = eval(q);
    g << rez;
    return 0;
}