Cod sursa(job #3131118)

Utilizator StefantimStefan Timisescu Stefantim Data 19 mai 2023 12:00:30
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.58 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");


stack <char> op;
vector < string > polo(100005);
string s;
int prioritate(char x)
{
    switch(x)
    {
        case '+':
        case '-': return 1;
        case '*':
        case '/':
        case '%': return 2;
    }
    return 0;
}


int main()
{
    stringstream ss;
    int nr1, nr2;
    int n;
    char aux;
    fin >> s;
    n = s.size();
    int cnt = 0;
    for(int i = 0; i < n; ++i)
    {
        if(s[i] >= '0' && s[i] <= '9')
        {
            polo[cnt].push_back(s[i]);
            if(i == n - 1 || (s[i + 1] < '0' || s[i + 1] > '9'))
                cnt++;
        }
        else
        if(s[i] == ')')
        {
            while(op.top()!='(')
            {
                aux = op.top();
                cnt--;
                ss.clear();
                ss << polo[cnt];
                ss >> nr2;
                polo[cnt].clear();
                cnt--;

                ss.clear();

                ss << polo[cnt];
                ss >> nr1;
                polo[cnt].erase();
                if(aux == '+')
                    nr1 = nr1 + nr2;
                else
                if(aux == '-')
                    nr1 = nr1 - nr2;
                else
                if(aux == '*')
                    nr1 = nr1 * nr2;
                else
                if(aux == '/')
                    nr1 = nr1 / nr2;
                ss.clear();
                ss << nr1;
                ss >> polo[cnt];
                ss.clear();
                cnt++;
                op.pop();
            }
            op.pop();
        }
        else
        if(op.empty() || s[i] == '(' ||  prioritate(s[i]) > prioritate(op.top()))
            op.push(s[i]);
        else
        {
            while(!op.empty() && prioritate(s[i]) <= prioritate(op.top()))
            {
                aux = op.top();

                cnt--;
                ss.clear();
                ss << polo[cnt];
                ss >> nr2;
                polo[cnt].clear();
                cnt--;

                ss.clear();
                ss << polo[cnt];
                ss >> nr1;
                polo[cnt].clear();
                if(aux == '+')
                    nr1 = nr1 + nr2;
                else
                if(aux == '-')
                    nr1 = nr1 - nr2;
                else
                if(aux == '*')
                    nr1 = nr1 * nr2;
                else
                if(aux == '/')
                    nr1 = nr1 / nr2;
                ss.clear();
                ss << nr1;
                ss >> polo[cnt];
                ss.clear();
                cnt++;

                op.pop();
            }
            op.push(s[i]);
        }
    }
    while(!op.empty())
    {
        aux = op.top();

        cnt--;
        ss.clear();
        ss << polo[cnt];
        ss >> nr2;
        polo[cnt].clear();
        cnt--;
        ss.clear();
        ss << polo[cnt];
        ss >> nr1;
        polo[cnt].clear();
        if(aux == '+')
            nr1 = nr1 + nr2;
        else
        if(aux == '-')
            nr1 = nr1 - nr2;
        else
        if(aux == '*')
            nr1 = nr1 * nr2;
        else
        if(aux == '/')
            nr1 = nr1 / nr2;

        ss.clear();
        ss << nr1;
        ss >> polo[cnt];
        ss.clear();
        cnt++;

        op.pop();
    }
    ss.clear();
    ss << polo[0];
    ss >> nr1;
    fout << nr1;

    return 0;
}