Cod sursa(job #2991239)

Utilizator AndreiMLCChesauan Andrei AndreiMLC Data 9 martie 2023 11:03:19
Problema Evaluarea unei expresii Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <bits/stdc++.h>

using namespace std;

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

char s[100005];

stack<int>nr;
stack<char>op;

void numere(int i)
{
    if(nr.empty())
    {
       nr.push(s[i] - '0');
    }else if(s[i-1] >= '0' && s[i-1] <='9')
    {
        int cop = nr.top();
        nr.pop();
        cop = cop * 10 + (s[i] - '0');
        nr.push(cop);
    }else{
        nr.push(s[i] - '0');
    }
}

void calcule(int nr1, int nr2)
{
    if(op.top() == '*')
    {
        nr.push(nr1 * nr2);
    }else if(op.top() == '/')
    {
        nr.push(nr2/nr1);
    }else if(op.top() == '+')
    {
        nr.push(nr1+nr2);
    }else{
        nr.push(nr2-nr1);
    }
}
void semne(int i)
{
    if(s[i] == '(')
    {
        op.push(s[i]);
    }else if(s[i] == ')')
    {
        while(op.top()!='(')
        {
            int nr1 =nr.top();
            nr.pop();
            int nr2 = nr.top();
            nr.pop();
            calcule(nr1,nr2);
            op.pop();
        }
        op.pop();
    }else if(op.top() == '*' || op.top() == '/')
    {
        int nr1 =nr.top();
        nr.pop();
        int nr2 = nr.top();
        nr.pop();
        if(op.top() == '*')
        {
            nr.push(nr1*nr2);
        }else{
            nr.push(nr2/nr1);
        }
        op.pop();
        op.push(s[i]);
    }else{
        op.push(s[i]);
    }
}

void check()
{
    while(op.size() > 1)
    {
        int nr1 =nr.top();
        nr.pop();
        int nr2 = nr.top();
        nr.pop();
        calcule(nr1,nr2);
        op.pop();
    }
}
int main()
{
    f.get(s,100001);
    int lung = strlen(s);
    s[lung] = ')';
    s[lung+1] = NULL;
    op.push('(');
    for(int i=0;i<=lung;i++)
    {
        if(s[i] >= '0' && s[i] <='9')
        {
            numere(i);
        }else{
            semne(i);
        }
    }
    //check();
    g << nr.top();
    return 0;
}